Java 无法更新JFrame

Java 无法更新JFrame,java,swing,jframe,Java,Swing,Jframe,我正在尝试更新帧,但没有发生。我如何做,以及当Refresh()调用时会发生什么 对不起,我说的是英语。您需要更正代码中的许多内容: 您需要正确地创建组件层次结构,并实例化组件层次结构中的所有对象。在您的示例中,应该正确初始化JFrame->JPanel->JTable并将其添加到组件层次结构中。您的代码没有实例化名为panel1的JPanel。您将在这一行setContentPane(panel1)中得到一个空指针异常 pack()和设置可见(真)方法。它们应该在Refresh()方法之后调

我正在尝试更新帧,但没有发生。我如何做,以及当Refresh()调用时会发生什么


对不起,我说的是英语。

您需要更正代码中的许多内容:

  • 您需要正确地创建组件层次结构,并实例化组件层次结构中的所有对象。在您的示例中,应该正确初始化JFrame->JPanel->JTable并将其添加到组件层次结构中。您的代码没有实例化名为
    panel1
    JPanel
    。您将在这一行
    setContentPane(panel1)中得到一个空指针异常

  • pack()
    设置可见(真)方法。它们应该在
    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
    
        }
    
    }
    

    您没有将tab添加到任何父组件。“通常”您只需更改模型数据,但由于您没有将其添加到任何组件中,这将是毫无意义的。您也可以考虑使用<代码>卡布局< /代码>,以便在视图之间切换更容易。如果这就是你想要做的。它在不同的文件中,并且是独立的。2.我在Intellij IDEA3的组件树中执行层次结构。使用pack();和setVisible(true);正如你所说,这并不能解决我的问题。我要说的是,这只是一个简化问题的例子。真正的项目更大,名字更好。好的。。那太好了。。我会更新我的答案。你能考虑第2点和第3点吗?你检查了点2吗?您没有初始化Jpanel,也没有将表添加到jpanelcreateUIComponents()调用创建的表中,因此我不会得到Null指针异常
    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
    
        }
    
    }