【问题标题】:Java - When designing a JFrame that will have a Canvas,Java - 当设计一个有 Canvas 的 JFrame 时,
【发布时间】:2016-05-29 11:53:31
【问题描述】:

用这两行代码调用方法后:

final Graphics canvasGraphics = screenCanvas.getGraphics();
canvasGraphics.fill3DRect(rectangleX, rectangleY, 500, 100, true);

程序运行时矩形闪烁,然后消失。但是,当我使用 MouseListener 将同一行放在匿名内部类中时:

screenCanvas.addMouseListener(new java.awt.event.MouseAdapter(){

    public void mousePressed(MouseEvent event){
        canvasGraphics.fill3DRect(rectangleX, rectangleY, 500, 100, true);
    }
}

矩形停留在那里。是什么导致了这种行为?

【问题讨论】:

  • screenCanvas.getGraphics(); - 不要这样做。创建一个JPanel,覆盖它的paintComponent 方法,在里面调用super.paintComponent(g) 并在那里进行自定义绘图。
  • 那么我应该调用 drawPanel.paintComponent(screenCanvas.getGraphics()) 哪里 drawPanel 是被覆盖的 JPanel?
  • 不,您应该在paintComponent 方法中执行所有绘画(您只需要一个面板)- 不需要getGraphics()。查看this 获取完整教程。顺便说一句,我认为矩形留在第二个 sn-p 中的原因是因为 RepaintManager 不会自动重新绘制框架,所以这样矩形会在那里停留一段时间。 (注意当你调整框架大小时它也会消失)
  • 非常感谢,这真的很有帮助。
  • 使用 java.awt.Canvas 的唯一原因是你想直接控制绘画过程

标签: java swing jframe awt java-2d


【解决方案1】:

首先您必须知道 JComponent 的 Graphics 在每次更改(调整大小、最小化、移动...)时都会更改(重新绘制),这发生在方法 public void paintComponent(Graphics g) 中。

在第一个场景中,两行代码只执行一次并且它们有效果(您注意到了 flash),但是每次更改时都会经常绘制组件,因此在启动您的应用程序时,canvasGraphics 是由两行代码填充,但之后调用了 paintComponent 方法,因此它再次重绘 Graphics,您的更改将丢失。

在第二种情况下,您没有直接在Graphics 上绘图,一旦单击鼠标,Graphics 就会更改,因此当程序启动并显示窗口时,paintComponent 将被执行,一旦鼠标是在 Canvas 内按下您重新实现的方法会被调用,Graphics 会被更改,但这次paintComponent 方法不会忽略您的更改,因为元素没有发生任何事情。

一种解决方案是在所需元素上重新实现 paintComponent 方法,以确保每次重新绘制元素时都执行您的更改。

【讨论】:

  • JFrame 没有 paintComponent 方法
猜你喜欢
  • 2013-10-14
  • 2013-01-17
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多