java - 滚动或调整主框架大小时,JPanel 中的绘图消失
问题描述
我在面板中绘制了许多形状并且它可以工作,但是当我滚动面板或调整框架大小时,图纸消失了。
我查看了有关此主题的其他问题,但没有找到解决问题的方法。
截图:
编码:
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);
推荐阅读
- javascript - 在另一个函数中使用 javascript 中的按钮停止倒计时
- java - "程序类型已经存在:Android.arch.lifecycle.LiveData$1
- android - 如何在使用 MapBox 加载地图之前防止黑屏闪烁?
- c++ - C++ 无锁队列实现中的虚假下溢
- java - Appium Java JUNIT - “我们找不到 *-tests.jar 文件” - AWS
- wordpress - 如何使用通配符子站点为 wordpress 添加加密证书
- php - 使用 PHP 从 MySQL 访问 IP 并更新它
- c - gcc:无法从目标文件创建 .so
- ios - 用UIScrollView缩放时,无法正常滚动到下端
- tsql - 选择值,即使 LEFT JOIN 上为 NULL