Diskussion:JTable (Tutorial)©
Das Beispiel 2 mit Vector scheint mir nicht mehr so wirklich zeitgemäß. Zumindest ist beim Kopieren nach Eclipse erstmal "alles" gelb. Vorschlag:
<code=java>import java.util.Vector;
import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable;
public class JTableDemoVectoren {
public static void main(String[] args) { /* Die Titel für die Tabelle bereitstellen: */ Vector<String> title = new Vector<>(); title.add("A"); title.add("B"); title.add("C"); title.add("D");
/* Die Daten für die Tabelle bereitstellen: */ Vector<Vector<String>> data = new Vector<>(); { Vector<String> rowA = new Vector<>(); rowA.add("1"); rowA.add("2"); rowA.add("3"); rowA.add("4");
data.add(rowA); } { Vector<String> rowB = new Vector<>(); rowB.add("5"); rowB.add("6"); rowB.add("7"); rowB.add("8");
data.add(rowB); } { Vector<String> rowC = new Vector<>(); rowC.add("9"); rowC.add("10"); rowC.add("11"); rowC.add("12");
data.add(rowC); }
/* Die Tabelle initialisieren: */ JTable table = new JTable(data, title);
/* Die Tabelle anzeigen: */ JFrame frame = new JFrame("Demo"); frame.getContentPane().add(new JScrollPane(table)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
}</code=java>
Crian
Auch die Vektoren im dritten Beispiel könnte man verbessern:
<code=java>import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import java.util.Vector;
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel;
public class JTabelDemoDefaultTableModell {
public static void main(String[] args) { new JTabelDemoDefaultTableModell(); }
public JTabelDemoDefaultTableModell() { /* Die Titel für die Tabelle bereitstellen: */ String[] titles = new String[] { "A", "B", "C", "D" };
/* * Das Model das wir verwenden werden. Hier setzten wir gleich die * Titel, aber es ist später immer noch möglich weitere Columns oder * Rows hinzuzufügen: */ final DefaultTableModel model = new DefaultTableModel(titles, 0);
/* Die Tabelle initialisieren: */ JTable table = new JTable(model);
/* Buttons zum Bearbeiten der Tabelle: */ final JButton addRowButton = new JButton("add row"); final JButton removeRowButton = new JButton("remove row"); final JButton addColumnButton = new JButton("add column");
removeRowButton.setEnabled(false);
/* Funktionalität für das Hinzufügen einer Zeile hinterlegen: */ addRowButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { /* Die Anzahl der Spalten der Tabelle (Breite): */ int size = model.getColumnCount();
/* * Einen neuen Vector mit der passenden Anzahl an Daten * herstellen: */ Vector<String> newDatas = createDataVector("row", size);
/* Eine neue Zeile hinzufügen: */ model.addRow(newDatas);
/* Das Entfernen der Zeile erlauben: */ removeRowButton.setEnabled(true); } });
/* Funktionalität für das Hinzufügen einer Spalte hinterlegen: */ addColumnButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { /* Die Anzahl der Zeilen der Tabelle (Höhe): */ int size = model.getRowCount();
/* * Einen neuen Vector mit der passenden Anzahl an Daten * herstellen: */ Vector<String> newDatas = createDataVector("column", size);
/* * Name der Spalte ermitteln (da wir in den Titeln keine * weiteren Spaltennamen hinterlegt haben, wird die Nummer der * Spalte (beginnend bei 0) als Spaltentitel angezeigt: */ String name = String.valueOf(model.getColumnCount());
/* Eine neue Spalte hinzufügen: */ model.addColumn(name, newDatas); } });
/* Funktionalität für das Löschen einer Zeile hinterlegen: */ final Random random = new Random(); removeRowButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { /* Die Anzahl der Spalten der Tabelle (Breite): */ int size = model.getRowCount();
/* Eine zufällige Zeile zum Löschen auswählen: */ int index = random.nextInt(size); model.removeRow(index);
/* Falls keine Zeilen mehr da sind, den Button deaktivieren: */ removeRowButton.setEnabled(size > 1); } });
/* Die Tabelle anzeigen: */ showGui(table, addRowButton, removeRowButton, addColumnButton); }
/** * Erzeugt einen Vector mit der passenden Anzahl an Strings. * * @param prefix * Text, der am Anfang jedes erzeugten Strings angezeigt wird. * @param size * Anzahl der zu erzeugenden Strings in dem Vector. * @return Vector mit der passenden Anzahl an Strings. */ public Vector<String> createDataVector(String prefix, int size) { Vector<String> vector = new Vector<String>(size); for (int i = 0; i < size; i++) { vector.add(prefix + " : " + size + " : " + i); }
return vector; }
/** * Zeigt die Oberfläche an. * * @param table * Darzustellende Tabelle * @param addRowButton * Schalter, um eine Zeile hinzuzufügen. * @param removeRowButton * Schalter, um eine Zeile zu entfernen. * @param addColumnButton * Schalter, um eine Spalte hinzuzufügen. */ private void showGui(JTable table, JButton addRowButton, JButton removeRowButton, JButton addColumnButton) { JFrame frame = new JFrame("Demo");
Container content = frame.getContentPane();
content.add(new JScrollPane(table), BorderLayout.CENTER); content.add(addRowButton, BorderLayout.NORTH); content.add(removeRowButton, BorderLayout.SOUTH); content.add(addColumnButton, BorderLayout.WEST);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
}</code=java>
Man könnte da natürlich noch mehr in Methoden auslagern, aber das würde vielleicht Anfänger eher irritieren.