在没有重新绘制背景的情况下在JPanel上绘图

时间:2013-02-27 13:53:04

标签: java swing jpanel repaint glasspane

我有一个在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());
}

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

我有一种感觉,我需要将我的十字准线涂在像Glass Pane这样的东西上,以便放在我的JPanel上 - 但是,JPanel没有提供Glass Pane。但是,JRootPane确实可以 - 我可以使用它吗?

P.S。

目前我正在逐像素地绘制分形,并且有很多小Line2D s。我最终会将其更改为生成BufferedImage - 在这种情况下,这个问题是否重要?

1 个答案:

答案 0 :(得分:1)

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

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

JavaDoc州:

  

如果组件是,则将指定的区域添加到脏区列表中   展示。 该组件将在所有当前重新绘制   已派发待处理事件