JMenuBar下拉到一个 "自定义 "的JPanel,并 "删除"

问题描述 投票:0回答:3

JMenuItemsJMenuBar 跌至 JPanel 添加到JFrame中,但JPanel会擦掉 JMenuItems. 我应该暂停重新绘制JPanel吗?我正在使用 getGraphics() 在...上 JPanel 绘制图像时,本方法由一个延迟200毫秒的线程调用。

编辑: 这是一个(非常简单的)游戏,在里面。JPanel. (我已经添加了一个字段 paused 到JPanel上,我已经编辑了绘画方法,所以它重新绘制了 JPanel 唯有 pausedfalse,然而我不知道这个 "解决方案 "好不好。(它被设置为 true 当用户点击菜单并设置成 false 当选择或取消它时)。)

java repaint
3个回答
2
投票

你应该总是重新绘制 JPanel 而不是一个任意的线程。 如果您想这样做是为了使面板产生动画(例如您提到的200ms延迟),那么可以考虑使用 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
投票

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

千万不要这样使用getGraphics()方法。你无法控制何时应该重新绘制组件。自定义绘画应该通过重写面板的paintComponent()方法来完成。当你使用Timer时,你只需使用panel.repaint(),Swing重绘管理器应该会处理需要绘制的细节。


0
投票

请看一下 javax.swing.Timer 文件

https:/docs.oracle.comjavase1.5.0docsapijavaxswingTimer.html。

它的顶部有代码,可以在固定的时间间隔内发射一个事件。

© www.soinside.com 2019 - 2024. All rights reserved.