JLayeredPane重绘删除了一些图像

时间:2012-12-27 10:17:34

标签: java image swing jlayeredpane

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

    }
}

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

1 个答案:

答案 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注释,以确保我重写正确的方法。