JMenuBar опускается до «пользовательского» JPanel и «стирается» - PullRequest
0 голосов
/ 24 марта 2010

JMenuItems из JMenuBar падает до JPanel, добавленного к JFrame, но JPanel стирает JMenuItems.
Должен ли я приостановить перерисовку JPanel?
Я использую getGraphics() на JPanel для рисования изображения, этот метод вызывается из потока с (например) задержкой 200 мс.

1012 * редактировать *:
Это (очень простая) игра внутри JPanel.
(Я добавил поле paused в JPanel и отредактировал метод рисования, поэтому он перерисовывает JPanel, только если paused равен false, однако я не знаю, является ли это «решение» хорошо (установлено на true, когда пользователь нажимает на меню, и на false, когда выбирает или отменяет его.)

Ответы [ 3 ]

2 голосов
/ 24 марта 2010

Вы всегда должны перерисовывать JPanel из потока рассылки событий, а не из произвольного потока. Если вы хотите сделать это для анимации панели (например, с задержкой в ​​200 мс, о которой вы упомянули), тогда попробуйте использовать javax.swing.Timer, который периодически запускает ActionEvent в потоке диспетчеризации событий.

Пример

  public class MyPanel extends JPanel {
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      // Add additional graphics operations here.
    }
  }

  final JPanel panel = new MyPanel();
  int delay = 200; // Milliseconds

  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          panel.repaint();
      }
  };

  new Timer(delay, taskPerformer).start();
1 голос
/ 24 марта 2010

Я использую getGraphics () на JPanel для рисования изображения

Никогда не используйте такой метод getGraphics (). Вы не можете контролировать, когда компонент должен быть перекрашен. Выборочная окраска должна быть сделана путем переопределения метода paintComponent () панели. Когда вы используете таймер, вы просто используете panel.repaint (), и менеджер перерисовки Swing должен следить за деталями того, что нужно рисовать.

0 голосов
/ 24 марта 2010

посмотрите javax.swing.Timer документацию

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/Timer.html

В правом верхнем углу есть код для запуска события с фиксированным интервалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...