2010-11-29 1 views
-1

I gefolgt von Oracle-Modell für die Implementierung eines AbstractJava Swing | extendiere AbstractTableModel und verwende es mit JTable | mehrere Fragen

http://download.oracle.com/javase/tutorial/uiswing/examples/components/TableDemoProject/src/components/TableDemo.java

Ich tat dies, weil meine Tabelle 3 Spalten enthalten hat, und das erste hat ein JCheckBox sein.

Hier ist mein Code:

public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel { 
private String[] columnNames = {"Auswahl", 
            "Dateiname", 
            "Pfad"}; 
    private Object[][] data = { 
    {new Boolean(true), "datei.tmp", 
    "/home/user/tmp"} 
    }; 

    public int getColumnCount() { 
     return columnNames.length; 
    } 

    public int getRowCount() { 
     return data.length; 
    } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    public Object getValueAt(int row, int col) { 
     return data[row][col]; 
    } 

    public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     if (col == 0) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void setValueAt(Object value, int row, int col) {    
     data[row][col] = value; 
     fireTableCellUpdated(row, col); 
    } 

}

Hier sind meine Fragen:

  1. Wie JTable (new JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)) wissen, was die Spaltennamen und ihre Werte sind? Da es in meinem AbstractTableModel keinen Konstruktor gibt ?! Ist es cacaue columnNames und Daten müssen benannt werden wie sie sind und JTable greift auf sie zu?
  2. Wie kann ich neue Werte in meine JTable einfügen? Seit columnNames und Daten sind Arrays. Kann ich sie durch Vektoren ersetzen? Wenn ja, wie initiiere ich diese Vektoren? In einem Konstruktor in myAbsTableModel?

Ich denke, es ist sehr einfach, eine Lösung zu bekommen, aber diese Tabelle Handhabung ist nicht trivial für mich, also vielen Dank!

+5

Ich sehe nie eine Klasse mit so langen Namen, kann Ihr Umbenennungs ‚FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel‘, um etwas mehr sinnvoll;)? –

+0

Der Klassenname ist ein Witz, oder? Bald brauchst du einen Festplattenreiniger, wenn du mit solchen Namen weitermachst ;-) –

+0

thx für deine nette Antwort, wenn ich dich minus eins kriegen könnte, würde ich das tun – JavaHater

Antwort

0

Erstens, ich glaube, Sie brauchen ein bisschen mehr über Java zu lernen, vor allem Erbe (ich bin Ihr Konstruktor Problem Referenzierung

Antworten auf Ihre Fragen.

  • über einen Spaltennamen definieren private final static Attribut, Ihre Spaltennamen unter der Annahme, sich nicht ändern.
  • seit Ihrer Klasse AbstractTableModel verläuft, können Sie einen Konstruktor für sie definieren, wo Sie die Daten übergeben werden. definieren Sie die getValueAt Methode das Modell zu ermöglichen, die Daten verwenden Sie gehen vorüber.

Einige weitere Hinweise:

  • nicht tun, was Sie in getColumnClass tun. Normalerweise haben alle Elemente in einer Spalte die gleiche Klasse, also geben Sie switch im Spaltenindex ein, um die Klassen zu erhalten.
  • eine JCheckBox in einem Ihrer Spalten hinzuzufügen, müssen Sie eine benutzerdefinierte TableCellRenderer
+1

Sie müssen keinen Code für einen benutzerdefinierten Renderer schreiben, um ein Kontrollkästchen anzuzeigen. JTable stellt einen Standard-Checkbox-Renderer und -Editor zur Verfügung. Alles, was Sie tun müssen, ist, die Methode getColumnClass() zu überschreiben, um für die Spalte Boolean zurückzugeben, und der entsprechende Renderer wird verwendet. – camickr

0
  1. Die JTable legt fest, wie viele Spalten durch den Aufruf getColumnCount() auf dem Säulen-Modell verwenden. Dann iteriert es und ruft getColumnName (idx) für jede Spalte auf. Ihre Klasse teilt ihr den Spaltennamen mit - sehen Sie sich die Implementierung dieser Methoden an.

  2. Sie können Ihre Daten in dem von Ihnen gewünschten Format speichern. Die JTable ruft Methoden in Ihrem Tabellenmodell auf, um diese Daten abzurufen. Wenn Sie Ihrem Modell neue Elemente hinzufügen möchten, können Sie eine addItem (Object o) -Methode für Ihr Modell implementieren. Achten Sie darauf, fireTableRowsInserted() für jedes neue Element aufzurufen.

2

Alle Swing-Komponenten sind mit Standardmodellimplementierungen ausgestattet. Ich schlage vor, Sie verstehen, wie Sie sie zuerst verwenden, bevor Sie versuchen, Ihre eigenen zu erstellen. Für eine JTable heißt sie DefaultTableModel. Lesen Sie die API für Methoden zum dynamischen Hinzufügen/Entfernen von Datenzeilen aus dem Modell. Hier ist ein einfaches Beispiel für den Einstieg:

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableBasic extends JPanel 
{ 
    public TableBasic() 
    { 
     String[] columnNames = {"Date", "String", "Integer", "Boolean"}; 

     Object[][] data = 
     { 
      {new Date(), "A", new Double(1), Boolean.TRUE }, 
      {new Date(), "B", new Double(2), Boolean.FALSE}, 
      {new Date(), "C", new Double(9), Boolean.TRUE }, 
      {new Date(), "D", new Double(4), Boolean.FALSE} 
     }; 

     JTable table = new JTable(data, columnNames) 
     { 
      // Returning the Class of each column will allow different 
      // renderers and editors to be used based on Class 

      public Class getColumnClass(int column) 
      { 
       for (int row = 0; row < getRowCount(); row++) 
       { 
        Object o = getValueAt(row, column); 

        if (o != null) 
         return o.getClass(); 
       } 

       return Object.class; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("TableBasic"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableBasic()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
Verwandte Themen