2017-06-12 90 views
0

我試圖更新框架,但它沒有發生。我如何做到這一點,以及Refresh()調用時會發生什麼?無法更新JFrame

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 
    } 
} 

對不起,我的英語。

+0

您還沒有添加標籤到任何父組件。 – Lemonov

+0

「通常情況下」您只需更改模型數據,但由於您沒有將其添加到任何內容中,所以它毫無意義。你也可以考慮使用'CardLayout'來更容易在視圖之間切換...如果這就是你想要做的事情 – MadProgrammer

回答

0

你需要糾正你的代碼中的許多東西:

  • 您需要正確地創建組件層次結構和實例化的組件層次結構中的所有對象。在你的例子中,你應該有JFrame - > JPanel - > JTable正確初始化並添加到組件層次結構中。您的代碼沒有實例化名爲panel1JPanel。您將在此行setContentPane(panel1);中收到空指針異常。

  • pack();setVisible(true);方法應該在您想要顯示您的UI之前調用。他們應該在你的Refresh()方法後被調用。再次,使用命名約定來正確地命名您的類和方法。

  • 我希望這有助於!

    更新:

    發佈代碼:

    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.它在單獨的文件中,並且它是cimpiling。 2.我在Intellij IDEA – BadStudent

    +0

    中進行組件樹的層次結構3.使用pack();和setVisible(true);正如你所說不能解決我的問題。而且,我需要說的是,這只是簡化問題的一個例子。真正的項目更大,名稱更好。 – BadStudent

    +0

    好的..多數民衆贊成在..我會更新我的答案。你可以考慮點2和3嗎? – anacron