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.
