自动重绘JPanel

时间:2011-08-23 23:36:16

标签: java swing graphics resize

在我用Java创建的gui中,每当我最小化窗口时,都会调用重绘,并且一旦窗口最大化(恢复正常),原来那里的绘图就会消失

所以我创建了一个动作侦听器,用于检测窗口何时被最小化,然后最大化,以便将最初在面板上的每个点绘制回屏幕。 不幸的是,我没有得到我预期的结果。 出于某种原因,当窗口最大化时,每个点都被拉回到面板上,但整个窗口的背景是黑色的。此外,每次他们想要最小化窗口时,用户必须等待每个点被拉回到屏幕上,这可能非常烦人。

这是我到目前为止所做的:

    //Redraw plot if window is minimized
    window.addWindowStateListener(new WindowAdapter()
    {
        Graphics g = dPanel.getGraphics();

        public void windowStateChanged(WindowEvent ev) 
        {
            boolean minimized = false;

            //If user minimizes window and then maximizes window
            if(window.getExtendedState() == Frame.ICONIFIED )
            {
                minimized = true;
                System.out.println("Window minimized");
            }

            if(ev.getNewState() == Frame.NORMAL || minimized == true)
            {

                System.out.println("Window back to normal state");

                //Draw each Point back onto the screen
                for(Point i: PointArray)
                {
                    drawPoint(g, i, startColor); 
                    System.out.println("Panel Repaint");
                }
            }
        }
    });
}

是否有某种方法可以编辑我的代码以实现所需的结果,或者有更好的方法来执行此操作。基本上,我只是希望当用户最小化GUI时,一旦用户最大化窗口,那么在最小化之前存在的绘画仍然存在。此外,移动窗口还可以使面板的某些部分重新绘制或整个面板重新绘制。

    //Draws point onto panel
public void drawPoint(Graphics g, Point PointArray, Color color)
{
    Graphics2D g2d = (Graphics2D)g;
    g2d.setStroke(new BasicStroke(2f));
    g.setColor(color); //g2d.setColor(Color.black); 
    g2d.drawOval((int)PointArray.a, (int)PointArray.b, 2, 2);
}  

3 个答案:

答案 0 :(得分:4)

我越了解你的情况和需求,我认为你应该越多地使用getGraphics,但不要在JComponent(如JPanel)上调用它。相反,你应该在BufferedImage中进行绘图,你应该通过在BufferedImage上调用getGraphics来获取BufferedImage的Graphics对象。然后,您可以使用Graphics#drawImage(...)方法在JComponent的paintComponent方法中绘制此BufferedImage,或者更简单的方法(如果您不想将图像用作JPanel或gui的背景) ,在JLabel中显示的ImageIcon中绘制图像。但有一点需要注意的是,如果你得到了你的Graphics对象,那么在你完成时不要忘记处理它。

答案 1 :(得分:3)

  

我只是希望当用户最小化GUI时,一旦用户最大化窗口,那么在最小化之前存在的绘画仍然存在。

我在上一个问题(关于组合框)中给出了答案。

你甚至感谢我的建议。

因此,在发布跟进问题之前,请尝试实施该建议。

答案 2 :(得分:0)

我刚想出一种强制重新绘制JPanel及其所有组件的方法。不要做任何特殊工作,只需致电您的JPanels.setVisible(false),然后再调用setVisible(true)。它会重绘一切!你不会看到任何闪烁,就像魔法一样。