java - JPanel的自动重绘

标签 java swing graphics resize

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

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

这是我目前所拥有的:

    //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);
}  

最佳答案

我对您的情况和需求了解得越多,我就越认为您实际上应该使用 getGraphics,但不要在 JPanel 等 JComponent 上调用它。相反,您应该在 BufferedImage 中进行绘图,并且您应该通过对 BufferedImage 调用 getGraphics 来获取 BufferedImage 的 Graphics 对象。然后,您可以使用 Graphics#drawImage(...) 方法在 JComponent 的 paintComponent 方法中绘制此 BufferedImage,或者因其简单性而更好(如果您不想将图像用作 JPanel 或 gui 的背景) , 在 JLabel 中显示的 ImageIcon 中绘制图像。但有一个警告是,如果您以这种方式获取 Graphics 对象,请不要忘记在完成后将其丢弃。

关于java - JPanel的自动重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168782/

相关文章:

java - elasticsearch - 没有为 [查询] 注册的查询]

java - 清除 Swing 绘图面板的前景

java - 组件不显示在自定义 JPanel/JComponent 中

python - Pygame图形错误: Couldn't open blue. png

java - 如何在 JFrames 中使用 2 类绘制通过 Netbeans 中的 Palette 生成代码?

java - JSNI(从 javascript 到 java 的调用)

java - 从 xsl :fo 生成 html xslt

c# - Lockbits 跨越 1bpp 索引图像字节边界

java - FileChannel.position() 线程安全吗?

java - 使用 Java Swing 显示日历