0

的下拉到一个添加到 JFrame 中,但 JPanel 删除JMenuItems了. 我应该暂停 JPanel 的重新绘制吗? 我正在使用用于绘制图像,此方法是从具有(例如)200 ms 延迟的线程调用的。JMenuBarJPanelJMenuItems

getGraphics()JPanel

编辑
这是一个(非常简单的)游戏JPanel
(我已经在 J​​Panel 中添加了一个字段paused,并且我已经编辑了 paint 方法,因此它重新绘制了JPanel唯一的 if pausedis false,但是我不知道这个“解决方案”是否好。(它设置为true当用户点击菜单并设置false为何时选择或取消它。)

4

3 回答 3

2

您应该始终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();
于 2010-03-24T14:11:28.343 回答
1

我在 JPanel 上使用 getGraphics() 来绘制图像

永远不要使用这样的 getGraphics() 方法。您无法控制何时应该重新绘制组件。自定义绘画应该通过覆盖面板的paintComponent() 方法来完成。当您使用 Timer 时,您只需使用 panel.repaint() 并且 Swing 重绘管理器应该注意需要绘制的细节。

于 2010-03-24T15:48:21.870 回答
0

看看javax.swing.Timer文档

https://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/Timer.html

它在顶部有代码以固定间隔触发事件。

于 2010-03-24T15:17:40.543 回答