在我用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);
}
答案 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)
。它会重绘一切!你不会看到任何闪烁,就像魔法一样。