Java JMenuBar下降到“a”;海关;JPanel和;抹去;

Java JMenuBar下降到“a”;海关;JPanel和;抹去;,java,repaint,Java,Repaint,JMenuBar的JMenuItems会下降到添加到JFrame的JPanel,但JPanel会删除JMenuItems 我应该暂停重新绘制JPanel吗? 我在JPanel上使用getGraphics()来绘制图像,这个方法是从一个(例如)延迟200毫秒的线程调用的 编辑: 这是JPanel中的一个(非常简单的)游戏 (我已经在JPanel中添加了一个字段paused,并且我编辑了绘制方法,因此只有当paused为false时,它才会重新绘制JPanel,但是我不知道这个“解决方案”是否好。(

JMenuBar
JMenuItems
会下降到添加到JFrame的
JPanel
,但JPanel会删除
JMenuItems

我应该暂停重新绘制JPanel吗?
我在
JPanel
上使用
getGraphics()
来绘制图像,这个方法是从一个(例如)延迟200毫秒的线程调用的

编辑
这是
JPanel
中的一个(非常简单的)游戏

(我已经在JPanel中添加了一个字段
paused
,并且我编辑了绘制方法,因此只有当
paused
false
时,它才会重新绘制
JPanel
,但是我不知道这个“解决方案”是否好。(当用户单击菜单时,它被设置为
true
,当选择或取消它时,它被设置为
false
。)

你应该总是从事件调度线程重画<代码> jPanel <代码>,而不是一个任意线程。如果你想这样做是为了使面板动画化(例如你提到了200毫秒的延迟),那么考虑使用<代码> javax。Swing。Time< /Cord>,它在事件调度线程上周期性地触发ActEngult。

示例

  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();

你应该总是从事件调度线程重画<代码> jPanel <代码>,而不是一个任意线程。如果你想这样做是为了使面板动画化(例如你提到了200毫秒的延迟),那么考虑使用<代码> javax。Swing。Time<代码>,它在事件调度线程上周期性地触发ActEngult。

示例

  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();

查看
javax.swing.Timer
文档


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

请查看
javax.swing.Timer
文档

它的顶部有代码,可以按固定的时间间隔触发事件

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

永远不要像那样使用getGraphics()方法。您无法控制何时重新绘制组件。自定义绘制应通过覆盖面板的paintComponent()方法来完成。使用计时器时,您只需使用panel.repaint()和Swing repaint管理器就可以查看需要绘制的细节

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


千万不要像那样使用getGraphics()方法。您无法控制何时重新绘制组件。自定义绘制应通过覆盖面板的paintComponent()方法来完成。使用计时器时,只需使用panel.repaint()即可Swing repaint管理器应该关注需要绘制的细节。

我如何在事件分派线程中调用“render”方法?您只需调用repaint()(参见我添加的示例代码)。但是,只有在制作动画时才需要执行此操作;否则,通常会根据事件触发(例如,单击按钮)更新UI,在这种情况下,通常不需要显式调用repaint()。如何在事件调度线程中调用“render”方法?只需调用repaint()(请参阅我添加的示例代码)。但是,只有在制作动画时才需要这样做;否则,您通常会根据事件触发(例如,单击按钮)更新UI,在这种情况下,通常不需要显式调用repaint()Swing计时器的任务是在事件调度线程中执行的。这意味着任务可以安全地操纵组件,但也意味着任务应该快速执行。如果您的任务可能需要一段时间来执行,那么考虑使用SWIFWER而不是计时器。Swing计时器的任务是在事件调度线程中执行的。这意味着任务可以安全地操纵组件,但也意味着任务应该快速执行。如果您的任务可能需要一段时间来执行,那么考虑使用SWIFWER来代替或在AD中执行。计时器的补充。有关使用SwingWorker类的说明以及在多线程程序中使用Swing组件的信息,请参阅。