Я пытаюсь создать программу, в которой отображаемая JTabel изменяется в зависимости от выбора пользователем файлов. Они вводят это, нажимая кнопку, вызывающую некоторый метод(), который возвращает новый JTable. Но я не могу заставить таблицу в графическом интерфейсе обновляться.revalidate() и repaint() не обновляет мой JPanel
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. вместо этого, но это тоже не хорошо.
EDIT: Спасибо за помощь, все это отсортированный сейчас :) Я переписал мой 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 бы поместить его где-то я Бесполезный Не хочу этого. Но с дополнительными JPanels внутри первичного, его можно контролировать.
Спасибо за комментарии, вы все просто спасли мой день!
Но зачем вам перерисовывать и обновлять JPanel, если вы хотите обновлять данные JTable? –
Установка нового значения для 'table' не изменяет содержимое вашей панели. Он по-прежнему ссылается на старое значение. – resueman
Более конкретно, комментарий к строке 'table = method(); // ложь метода, который изменяет значения таблицы . Это не меняет значение таблицы; он, вероятно, создает новую таблицу – FredK