2016-01-05 3 views
1

Я пытаюсь создать программу, в которой отображаемая 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 внутри первичного, его можно контролировать.

Спасибо за комментарии, вы все просто спасли мой день!

+0

Но зачем вам перерисовывать и обновлять JPanel, если вы хотите обновлять данные JTable? –

+1

Установка нового значения для 'table' не изменяет содержимое вашей панели. Он по-прежнему ссылается на старое значение. – resueman

+0

Более конкретно, комментарий к строке 'table = method(); // ложь метода, который изменяет значения таблицы . Это не меняет значение таблицы; он, вероятно, создает новую таблицу – FredK

ответ

2

Если вы хотите переписать на изменить содержимое таблиц, вам не нужно беспокоиться о ручной перекраске.

Попробуйте изменить свой код

table.setModel (method()); 

И model() возвращающая TableModel вместо JTable.

Вы не видите никаких изменений, так как старый JTable по-прежнему добавляется на вашу панель. Вам придется удалить старый/добавить новый, если вы настаиваете на том, чтобы ваш метод был таким, каким он есть.

Удачи.

Смежные вопросы