revalidate()和repaint()没有更新我的JPanel

时间:2016-01-05 19:04:51

标签: java swing user-interface jpanel repaint

我正在尝试制作一个程序,其中显示的JTabel会根据用户选择的文件进行更改。他们通过单击调用某个方法()的按钮来输入它,该方法返回一个新的JTable。但我无法在GUI中获取更新表。

public class program extends JFrame{

public JPanel panel;
public JTable table;

  public program{
    this.panel = new JPanel();
    panel.setLayout(new FlowLayout());

    JTable table = new JTable();
    panel.add(table);

    JButton button = new JButton();
    button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            JFileChooser chooser = new JFileChooser();
            if(browser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ 
            table = method(); //some method that changes the values of the table 
            panel.revalidate();
            panel.repaint();
            }
        };
    });
    panel.add(button);

    setContentPane(panel);
    setVisible(true);
  }

private static JTable method(){ ... }

public static void main(String[] args){
  program something = new program();
}

}

我不完全确定validate()revalidate()repaint()之间的差异,尽管他们已经阅读了很多内容。我也试过table.revalidate()等。相反,但这也不好。

编辑:感谢您的帮助,现在全部排序了:)我将我的ActionListener重写为resueman的“指示”:

   JButton button = new JButton();
   button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        JFileChooser chooser = new JFileChooser();
        if(browser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){  
        panel.remove(table);
        table = method();
        panel.add(table);
        panel.revalidate();
        panel.repaint();
        }
    };
});

我犹豫是否这样做,因为FlowLayout会把它放在我不想要的地方。但是在主要内部有额外的JPanel,它可以被控制。

感谢您的评论,大家都救了我的一天!

1 个答案:

答案 0 :(得分:2)

如果您可以重新设计更改表格内容,则无需担心手动重新绘制。

尝试将代码修改为

 table.setModel (method());

model ()返回TableModel而不是JTable

您没有看到任何更改,因为旧的JTable仍会添加到您的面板中。如果您坚持按照原样保留方法,则必须删除旧的/添加新内容。

祝你好运。