我正在尝试制作一个程序,其中显示的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
仍添加到了面板中。如果您坚持按原样使用方法,则必须删除旧的/添加新的。祝好运。