Как перерисовать JPanel после рисования на нем?

#java #swing #jpanel

#java #swing #jpanel

Вопрос:

У меня есть компонент, который наследуется от JPanel, я рисую на нем сетку. Теперь у меня есть JComboBox, и я хочу, чтобы пользователь мог выбрать размер сетки здесь, а затем нажать кнопку, чтобы изменить сетку (перекрасить сетку).

Дело в том, что он рисует начальную сетку, но как только пользователь выбирает размер сетки из JComboBox и нажимает на кнопку, ничего не происходит. Я должен свернуть форму, а затем восстановить ее снова, чтобы увидеть изменения.

Есть какие-нибудь идеи? Код приведен ниже.

Компонент:

 public class Board extends JPanel {
    ...

    protected void paintComponent(Graphics og) {
        super.paintComponent(og);
        ...
        }
    }    
}
  

Основной класс

 public class Main extends javax.swing.JFrame {
...

public Main() {                                   //This works great.
    board = new Board( ... );
    somePanel.add(board, BorderLayout.CENTER);

}

public void someButtonActionPerformed(Event e) { //This is not working

    somePanel.remove(board);
    board = new Board( ... );
    somePanel.add(board);
    somePanel.invalidate()
    board.repaint();
}
  

Ответ №1:

Попробуйте вызвать somePanel.revalidate() . Это сообщит AWT, что вы изменили дерево компонентов.

РЕДАКТИРОВАТЬ: изменено с invalidate на revalidate

Комментарии:

1. Спасибо за ваш ответ. Я уже пробовал это, не сработало: ( J.

2. Возможно, вы захотите обновить свой код в вопросе, чтобы показать это. Действительно ли вызывается someButtonActionPerformed метод? Вы добавили System.out.println для проверки?

3. Упс! Я хотел сказать revalidate в своем ответе, не invalidate . Это может быть проблемой.

4. Именно в этом и заключалась проблема! Спасибо, мой друг, ты был чрезвычайно полезен. J.

5. Никаких проблем. Я бы порекомендовал ознакомиться с invalidate , validate и revalidate , если вы еще этого не сделали. Их может быть сложно сделать правильно.