2017-06-12 3 views
0

Ich versuche, den Rahmen zu aktualisieren, aber es passiert nicht. Wie kann ich das machen und was passiert, wenn Refresh() anruft?Kann JFrame nicht aktualisieren

public class tttt extends JFrame{ 
    private JTable tab; 
    private JPanel panel1; 

    private void createUIComponents() {//Custom Create for tab 
     Object[][] data1 = {{'1'}}; 
     Object[] data2 = {'2'}; 
     tab = new JTable(data1, data2); 
    } 

    public void CreateFrame(){ 
     setContentPane(panel1); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public void Refresh(){ 
     Object[][] data1 = {{'9'}}; 
     Object[] data2 = {'9'}; 
     this.tab = new JTable(data1, data2); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     tttt Frame = new tttt();//create frame with table with '1' 
     Frame.CreateFrame(); 
     Frame.Refresh();//frame doesn`t change 
    } 
} 

Entschuldigung für mein Englisch.

+0

Sie fügen nicht Tab einem übergeordneten Komponente. – Lemonov

+0

"Normalerweise" würden Sie einfach die Modelldaten ändern, aber da Sie es nicht zu etwas hinzufügen, wäre es sinnlos. Sie können auch ein 'CardLayout' verwenden, um den Wechsel zwischen den Ansichten zu erleichtern ... wenn Sie das versuchen – MadProgrammer

Antwort

0

Sie müssen viele Dinge in Ihrem Code beheben:

  1. Sie müssen richtig die Komponentenhierarchie erstellen und instanziiert alle Objekte in der Komponentenhierarchie. In Ihrem Beispiel sollte JFrame -> JPanel -> JTable korrekt initialisiert und zur Komponentenhierarchie hinzugefügt werden. Ihr Code instanziiert nicht die JPanel mit dem Namen panel1. Sie erhalten eine Null-Zeiger-Ausnahme in dieser Zeile setContentPane(panel1);.

  2. Die Methoden pack(); und setVisible(true); sollten aufgerufen werden, bevor Sie Ihre Benutzeroberfläche anzeigen möchten. Sie sollten nach Ihrer Refresh() Methode aufgerufen werden. Verwenden Sie wieder Namenskonventionen, um Ihre Klassen und Methoden korrekt zu benennen.

Ich hoffe, das hilft!

Update:

Posting Code:

public class tttt extends JFrame{ 
    private JTable tab; 
    private JPanel panel1; 
    private JButton btnAddData; 

    private void createUIComponents() {//Custom Create for tab 
     Object[][] data1 = {{'1'}}; 
     Object[] data2 = {'2'}; 
     tab = new JTable(data1, data2); 
     btnAddData = new JButton("Refresh"); 

     btnAddData.addActionListener(e->Refresh()); 

     panel1 = new JPanel(new BorderLayout(10, 10)); 
     panel1.add(btnAddData, BorderLayout.NORTH); 
     panel1.add(tab, BorderLayout.CENTER); 
    } 

    public void CreateFrame(){ 
     createUIComponents(); 
     setContentPane(panel1); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public void Refresh(){ 
     Object[][] data1 = {{'9'}}; 
     Object[] data2 = {'9'}; 
     tab.setModel(new DefaultTableModel(data1, data2)); 
     revalidate(); 
    } 

    public static void main(String[] args) { 
     tttt Frame = new tttt();//create frame with table with '1' 
     Frame.CreateFrame(); 
//  Frame.Refresh();//frame doesn`t change 

    } 

} 
+0

1. Es in separaten Dateien und es cimpiling. 2. Ich mache Hierarchie in Komponentenbaum in Intellij IDEA – BadStudent

+0

3. Mit pack(); und setVisible (wahr); wie du sagst, löst mein Problem nicht. Und ich muss sagen, dass es nur ein Beispiel ist, um die Frage zu vereinfachen. Echtes Projekt ist größer und mit besseren Namen. – BadStudent

+0

Ok .. Das ist gut .. Ich werde meine Antwort aktualisieren. Können Sie die Punkte 2 und 3 in Betracht ziehen? – anacron