#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
, если вы еще этого не сделали. Их может быть сложно сделать правильно.