我需要一个UI,我想在其中描绘网络设备的图形表示。为此,我只是加载多个图像并逐个重叠以显示设备的当前状态。我必须支持缩放此视图。缩放代码如下所示。
public void zoom(double factor){
if (factor < MIN_ZOOM_VALUE)
factor = MIN_ZOOM_VALUE;
else if (factor > MAX_ZOOM_VALUE)
factor = MAX_ZOOM_VALUE;
scaleFactor = factor;
layeredPane.revalidate();
layeredPane.repaint();
}
图像作为标签添加。
private class ImageLabel extends JLabel{
private ImageIcon image;
private Position position;
public ImageLabel(ImageIcon image, Position position){
super(image);
this.image = image;
this.position = position;
}
public void paintComponent(Graphics g) {
int newX = (int)(position.getLeft() * scaleFactor);
int newY = (int)(position.getTop() * scaleFactor);
Graphics2D g2 = (Graphics2D)g;
int newW = (int)(position.getWidth() * scaleFactor);
int newH = (int)(position.getHeight() * scaleFactor);
setBounds(newX, newY, newW, newH);
g2.setRenderingHint(
//RenderingHints.KEY_INTERPOLATION,
//RenderingHints.VALUE_INTERPOLATION_BILINEAR);
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.drawImage(image.getImage(), 0, 0, newW, newH, null);
}
}
但问题是,当我放大一次并缩小时,一些图像会消失。知道它为什么会这样吗?
答案 0 :(得分:2)
+1给@AndrewThompsons评论。
我能看到的另一个问题是你不尊重油漆链。
还要记住通过调用super.XXX
覆盖绘制方法的实现(以及任何覆盖方法)来尊重绘制链,除非你知道你在做什么并且是故意的没有调用他们的super
实现,或者像你描述的那些可视/将要发生的视觉工件。
要执行此操作,您可以将super.paintComponent(Graphics g)
作为覆盖paintComponent
的第一种方法,如下所示:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//do other drawings here
}
另请注意我如何使用@Override
注释,以确保我重写正确的方法。