JTable befüllen

ChriMo

Mitglied
Hi
Habe mit Netbeans eine JTable (heißt jTable1) erstellt,
aus einer Datenbank werden mit dem DefaultTableModel Daten ausgelesen (-> modell)
Wenn ich mit jTable1.setModel(modell) die Daten in die jTable1 schreiben will:

Fehler "non-static variable jTable1 cannot be referenced from a static context"

Wenn ich es jedoch selber mache, funktioniert es:
Java:
JFrame f = new JFrame(); 
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JTable table = new JTable();
f.add( new JScrollPane( table ) );
f.pack();
f.setVisible( true );
table.setModel(modell);
Der Netbeans-Designer generiert den Code beginnend mit:
private void initComponents()

Soweit ich herausgefunden habe, würde es - glaub ich - funktionieren, wenn ich es ändern würde auf:
private static void initComponents()

Der Code ist jedoch grau und kann nicht geändert werden - was tun?


LG
Chrimo
 
Zuletzt bearbeitet von einem Moderator:

vfl_freak

Premium-User
Moin,

bitte was? *bahnhof*
Wenn Du in dem Schnipsel "table" in "jTable1" umbenennst, dann funktioniert es nicht :confused:

Wohl kaum ...

Poste mal den kompletten Code .....

Gruß
Klaus
 

ChriMo

Mitglied
Habe Beispielscode auf das Wesentliche reduziert.
Den Code, den Netbeans-Matisse kreiert hat, habe ich nicht mitkopiert (Zeile 13):

Neubefüllen der Tabelle:
Mit "jTable1.setModel(rowData, columnNames);" - Zeile 27 funktioniert es jedenfalls nicht.


Code:
import java.awt.HeadlessException;
import javax.swing.JTable;

public class test extends javax.swing.JFrame {
   
    public test() {
        initComponents();
    }
    
    @SuppressWarnings("unchecked")
    
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
 private void initComponents() {…49 lines }
    
    public static void main(String args[]) {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new test().setVisible(true);
            }   
        });
  // DAS SOLL DER NEUE INHALT DER JTABLE SEIN:  
            String[][] rowData = { { "Neu1", "11" }, { "Neu2", "22" } };
            String[] columnNames = { "A","B" };

// WIE MACH ICH DAS****?
            jTable1.setModel(rowData, columnNames);
            
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   
  }

LG
ChriMo
 

sirstefan

Mitglied
Hallo ChriMo,

deine main-Methode ist static, deine jTable-Variable nicht.

Um nicht zu sehr ins Detail zu gehen:
Variablen, die static sind, können über alle Instanzen der Klasse hinweg aufgerufen werden und haben dort jeweils den selben Wert.

Variablen, die nicht static sind, ändern sich zur Laufzeit und sind für jede Instanz anders. Wenn du jetzt versuchst, über eine static-Methode auf so eine Variable zuzugreifen, wird das nicht funktionieren, da die Methode für alle Instanzen gleich ist, die Variable aber nicht. Und genau das ist bei dir der Fall.

Wenn ich das bis jetzt richtig behirnt habe, wäre es korrekt, jTable.setModel in initComponent() aufzurufen. Nachdem aber das Model anscheinend ständig mit rowData und columnNames gefüttert wird, wird das nicht richtig funktionieren.

Um den Ablauf richtig zu verstehen, brauche ich daher mehr Infos. Wie und wann wird das Neuladen der Tabelle angestoßen?
 

ChriMo

Mitglied
Hi
Habe die Lösung gefunden: Ich hol mir das DefaultTableModel der JTable.

Code:
public NewJFrame() {
        initComponents();
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
         model.setValueAt("AAA", 3, 1);   //Nur so, um zu zeigen, dass es geht.
         model.addRow(new Object[]{}); //ebenfalls nur so

// DAS SOLL DER NEUE INHALT DER JTABLE SEIN:  
            String[][] rowData = { { "Neu1", "11" }, { "Neu2", "22" } };
            String[] columnNames = { "A","B","C","D" };
 
// WIE MACH ICH DAS****?
            model.setDataVector(rowData, columnNames)    
}

Und wenn man stattdessen den Code z.B. zur Action eines JButtons einfügt, hat das Ganze auch einen praktischeren Sinn.

LG und Danke für eure Reflexionen
ChriMo
 

Neue Beiträge