【问题标题】:Drawing on a JPanel without repainting background在 JPanel 上绘图而不重新绘制背景
【发布时间】:2013-02-13 08:39:43
【问题描述】:

我有一个算法可以在 JPanel 上显示漂亮的分形。每当用户将鼠标悬停在面板上时,我希望能够在分形面板上显示网格线“十字准线”。

我已经通过一种快速、简单的方法来绘制类似这样的东西(fractal 是分形 JPanel 的名称):

@Override
public void mouseMoved(MouseEvent e) {
    Graphics g = fractal.getGraphics();
    // <problematic part>
    //   This is computationally expensive to do. It takes a good 0.2 seconds.
    //   This must be done to clear 'old' crosshairs
    fractal.repaint();
    // </problematic part>
            
    Color c = fractal.getColourScheme().getGridlineColour();
    g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 50));
            
    // Draw crosshairs around the mouse's current point
    g.drawLine(e.getX(), 0, e.getX(), fractal.getHeight());
    g.drawLine(0, e.getY(), fractal.getWidth(), e.getY());
}

如图所示,我必须 repaint() 以清除任何旧的十字准线。

我有一种感觉,我需要在诸如 Glass Pane 之类的东西上绘制我的十字准线以放在我的 JPanel 之上 - 但是,JPanel 不提供 Glass Pane。 JRootPane 可以 - 我可以使用它吗?

附言

目前我正在用大量的Line2Ds 逐个像素地绘制分形。我最终会将其更改为生成 BufferedImage - 在这种情况下,这个问题是否重要?

【问题讨论】:

  • 使用BufferedImage
  • 在单独的玻璃面板上画线而不是重绘不是更好吗?即使是BufferedImage
  • 嗯,有clearRect
  • 嗯,我就用BufferedImage。如果当我在全屏模式下移动鼠标时它完全滞后,我会回来抱怨=P
  • 是的,虽然我正在缓存 BufferedImage,并且仅在绝对必要时才重新生成它,但我仍然从十字准线获得较差的视觉性能。我需要重新考虑这是如何绘制的。

标签: java swing jpanel repaint glasspane


【解决方案1】:

我认为您使用玻璃窗格的想法将永久解决您的问题。无论您选择如何绘制分形本身,或者它是否显示在 JPanel 或任何其他类型的组件中,都不再重要。每个对象都应该真正对自己的数据和操作负责,因此不同的对象确实可能是一个不错的设计选择。

话虽如此,您仍然需要重新粉刷玻璃窗格。 您应该能够使用public void repaint(long tm, int x, int y, int width, int height) 方法仅重新绘制面板的某些部分,而不是重新绘制整个部分。

JavaDoc 声明:

如果组件是,则将指定区域添加到脏区域列表中 显示。 组件将在当前所有 待处理的事件已被调度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多