2016-11-16 10 views
0

Ich versuche, eine JTable in IntelliJ mit zwei Spalten zu erstellen: eine ist ein Kontrollkästchen, und die andere ist eine Zeichenfolge. Ein Benutzer kann eine beliebige Zeichenfolge zur Tabelle hinzufügen, indem er eine JButton drückt, und jedes Mal, wenn die Schaltfläche gedrückt wird, wird eine neue Zeile zu der Tabelle hinzugefügt, in der die erste Spalte ein Kontrolle-Kästchen und die Sekunde die beliebige Zeichenfolge ist. Dies kann beliebig oft geschehen, indem der Tabelle eine beliebige Anzahl von Zeilen hinzugefügt wird. Wenn Sie auf die Kontrollkästchen klicken und eine Entfernen-Schaltfläche drücken, wird diese Zeile aus der Tabelle entfernt. Dieser ganze Prozess funktioniert gut, aber es ist nicht das, womit ich Probleme habe.Erstellen einer persistenten Referenz auf JTable-Daten

Jedes Mal, wenn der Benutzer die Schaltfläche drückt, um der Tabelle eine Zeichenfolge hinzuzufügen, möchte ich diese Zeichenfolge zu einem konsistenten Objekt/Container hinzufügen. So bei der Initialisierung des Objekt leer ist,

Object[][] tableData; 

aber wenn die Taste gedrückt wird das Objekt jetzt die „Checkbox“ durch einen boolean enthält, dargestellt und die Zeichenfolge.

Object[][] tableData = { 
    {false, "String"} 
} 

Und das kann für eine Weile gehen.

Object[][] tableData = { 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"} 
} 

Und wenn eine der Boolesche Werte auf true geändert (über das Kontrollkästchen), und die Entfernen-Taste gedrückt wird, dann, dass bestimmte „Zeile“ oder Teil des Objekts gelöscht wird. Wie würde ich dieses Objekt oder diesen Container erstellen und verwalten? Gibt es einen besseren Weg, dies ohne ein Objekt zu tun?

Eine einfache Übersicht über das, was ich gerade habe, ist unten.

String colNames = {" ", "String"}; 
DefaultTableModel tableModel = new DefaultTableModel(colNames, 0); 

importTable = new JTable(tableModel) { 
    @Override 
    public Class getColumnClass(int column) { 
     switch(column) { 
      case 0: 
       return Boolean.class; 
      default: 
       return String.class; 
     } 
    } 
}; 

importButton.addActionListener(new ActionListener() { 
    public void actionPerofrmed(ActionEvent e) { 
     Object[][] newData = { 
      {false, "String"} 
     }; 
     tableModel.addRow(newData[0]); 
    } 
}); 

removeButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     for (int i = 0; i < tableModel.getRowCount(); i++) { 
      Boolean checked = (Boolean) tableModel.getValueAt(i, 0); 
      if (checked) { 
       tableModel.removeRow(i); 
       i--; 
      } 
     } 
    } 
}); 

Antwort

1

Ist das nicht genau das, wofür Ihr Tischmodell ist? Wenn Sie einen anderen Daten- "Nukleus" für Ihr Tabellenmodell benötigen, verwenden Sie eine ArrayList<CustomType>, wobei CustomType eine Klasse ist, die einen Booleschen Wert und einen String enthält und jede Datenzeile in Ihrer JTable darstellt. Erweitern Sie dann AbstractTableModel und geben Sie Ihre ArrayList an oben, überschreiben Sie die notwendigen Methoden, achten Sie darauf, die entsprechenden fireXxxx(...) Methoden wo erforderlich, und Sie sind im Geschäft.

Oder bleiben Sie mit dem DefaultTableModel, und schreiben Sie Code, um es einfach zu und von den Objekten zu übersetzen, die Sie benötigen.

Beachten Sie, dass ein Teil Ihrer Post mich verwirrt - Ihre Verwendung von unflexiblen und objektorientiert brechen 2D-Objekt-Arrays - warum?

+0

Die Funktion "getValueAt" in DefaultTableModel funktionierte perfekt. Was deine Frage angeht, ich fürchte, ich kenne die Antwort darauf nicht. Das ist das erste Mal, dass ich so etwas in Java programmiere. – Kyleryan19

Verwandte Themen