Diskussion:JTable (Tutorial)©

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

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.