我正在尝试制作一个程序,其中显示的JTabel会根据用户的文件选择进行更改。他们通过单击调用某些method()的按钮来输入此内容,该按钮返回一个新的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() ect。相反,但这也不好。

编辑:感谢您的帮助,现在全部整理了:)我将我的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中包含其他JPanel,则可以对其进行控制。

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

最佳答案

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

尝试将您的代码修改为

 table.setModel (method());


并且model ()返回TableModel而不是JTable

您看不到任何更改,因为旧的JTable仍添加到了面板中。如果您坚持按原样使用方法,则必须删除旧的/添加新的。

祝好运。

09-05 07:42