java - 滚动或调整主框架大小时,JPanel 中的绘图消失

标签 java

我在面板中绘制了许多形状并且它可以工作,但是当我滚动面板或调整框架大小时,绘图会消失

我查看了有关此主题的其他问题,但没有找到该问题的解决方案。

截图:

1 2 3

代码:

public class ZoomPane {

    public static void main(String[] args) {
        new ZoomPane();
    }

    public ZoomPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                .  . .
            }
        });
    }

    public class TestPane extends JPanel {

        private float scale = 1;

        public TestPane() {
            addMouseWheelListener(new MouseAdapter() {

                @Override
                public void mouseWheelMoved(MouseWheelEvent e) {
                    double delta = 0.05f * e.getPreciseWheelRotation();
                    scale += delta;
                    revalidate();
                    repaint();
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            Dimension size = new Dimension(200, 200);
            size.width = Math.round(size.width * scale);
            size.height = Math.round(size.height * scale);
            return size;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            AffineTransform at = new AffineTransform();
            at.scale(scale, scale);
            g2d.setTransform(at);

            g2d.setColor(Color.RED);


            gr.draw(new Line2D.Double((int)this.getWidth() / 2, 0, (int)this.getWidth() / 2, this.getHeight())); 
            gr.draw(new Line2D.Double(0, (int)this.getHeight() / 2, this.getWidth(), (int)this.getHeight() / 2));


            g2d.dispose();
        }
    }
}

如何修复此错误?

最佳答案

您正在破坏 Swing 实现的 Graphics2D 转换。 JScrollPane 依赖于它。

您需要附加到它,而不是替换转换。替换这个:

AffineTransform at = new AffineTransform();
at.scale(scale, scale);
g2d.setTransform(at);

这样:

AffineTransform at = new AffineTransform();
at.scale(scale, scale);
g2d.transform(at);

setTransform 取代了变换; transform 方法附加到它。

更简洁的解决方案是将所有三行替换为:

g2d.scale(scale, scale);

关于java - 滚动或调整主框架大小时,JPanel 中的绘图消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54131279/

相关文章:

java - 是否有可用于 jvisualvm 或 NetBeans 分析器的调用 TreeView ?

java - 从嵌套结构中删除谓词(google guava 谓词)

java - 如何使用 JsonPath 向 Json 添加新节点?

java - Leetcode 110. Balanced Binary Tree 请问我的解为什么错了?

java - 我可以从启动启动一个 Activity 并让它进入后台而不让用户看到它吗,android

java - 我如何在 main(String[] args) 中显示它以及如何在 xml 中连接这些类和/或构造函数?

java - ReSTLet Android 客户端 - 如何将 ASP.NET Web API 的 JSON 响应映射到我的 Java 对象

java - 如何测量JBOSS 7服务器的启动时间?

java - 无法从静态上下文错误中引用非静态方法

java - org.springframework.orm.hibernate4.HibernateSystemException : Unknown entity: java. util.ArrayList;