1

我需要一个 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);

    }
}

但这里的问题是,当我放大一次并缩小时,一些图像会消失。知道为什么它会这样吗?

4

1 回答 1

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注释的,这样我就可以确定我覆盖了正确的方法。

于 2012-12-27T11:49:45.707 回答