JLabel画了两次

时间:2015-07-08 21:57:48

标签: java swing

在开始之前,让我说我是Java的新手。我为自己的无知而事先道歉。

所以,我创建了一个JFrame,将图像作为ImageIcon加载,并将其转换为JLabel,我将其添加到Frame中。问题是,控制标签的大小和位置是一种痛苦。

我找到了这个解决方案:

        final ImageIcon image = new ImageIcon(loadFrames.class.getResource("/images/testimage.png"));


    JLabel imageLabel = new JLabel(image){

        @Override
        public void paintComponent (Graphics g) {
            super.paintComponent (g);
                if (image != null) {
                    g.drawImage (image.getImage(), 300, 0, image.getIconWidth(), image.getIconHeight(), null);
                }
            }
        };

        gameFrame.add(imageLabel);  

        imageLabel.setVisible(true);
        gameFrame.setVisible(true);

正如您所看到的,我在网上找到了一个显示Graphics对象用法的回复。我不知道它的工作原理或工作原理,但确实如此。问题是,图像被绘制两次。一旦进入原点(中心),一次进入(300,0)。

感谢有关如何阻止它在原始位置绘制的任何反馈。如果您知道更简单的方法来调整标签的大小和位置,也可以这样说。我没有使用LayoutManager。

3 个答案:

答案 0 :(得分:4)

您为JLabel提供了ImageIcon ...

JLabel imageLabel = new JLabel(image)

然后覆盖它的paintComponent方法并手动绘制......

JLabel imageLabel = new JLabel(image){
    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
            if (image != null) {
                g.drawImage (image.getImage(), 300, 0, image.getIconWidth(), image.getIconHeight(), null);
            }
        }
    };

......不确定你预期会发生什么......

JLabel是显示图片的默认方式。

调用drawImage时,您应该将this作为所有Swing组件实施的ImageObserver,特别是在使用ImageIcon加载图片时,因为图片可能不会在组件首次涂漆时已完成装载。使用this作为ImageObserver允许组件在图像加载状态发生变化时自动安排重新绘制

也许你应该仔细看看How to Use Labels

答案 1 :(得分:1)

我没有评论的声誉,所以我回答。

问题是当您创建

时,中心的图像是JLabel图像
Jlabel imageLabel = new JLabel(**image**)

只需像这样

创建此图像
JLabel imageLabel = new JLabel(){...}

答案 2 :(得分:0)

只需删除paintComponent方法即可。您已将图像添加到标签中。

你应该尽量避免使用你不了解的代码,或者在询问之前尝试了解发生的事情,尽量不要说:

  

我不知道它的工作原理或工作原理,但确实如此。

这不是一个好的编程实践。