Java—更新JLabel';s图标,新图标放在旧图标后面

Java—更新JLabel';s图标,新图标放在旧图标后面,java,swing,jlabel,Java,Swing,Jlabel,我试图做的是创建一个gui,允许您选择一个图像,显示该图像,然后为学校项目对其执行操作。这就是启动时发生的事情。完美的但是,当我更新图标时,它会将新图标置于其后面: 以下是我在Jlabel上使用的代码: ImageIcon imageIcon = new ImageIcon(); try { imageIcon = new ImageIcon(ImageIO.read(new File("/Users/ryanauger/Repos/JavaGUI/GUI

我试图做的是创建一个gui,允许您选择一个图像,显示该图像,然后为学校项目对其执行操作。这就是启动时发生的事情。完美的但是,当我更新图标时,它会将新图标置于其后面:

以下是我在Jlabel上使用的代码:

ImageIcon imageIcon = new ImageIcon();
        try {
            imageIcon = new ImageIcon(ImageIO.read(new File("/Users/ryanauger/Repos/JavaGUI/GUI/Images/cameraIcon.png")));
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            imageIcon = new ImageIcon();
            e2.printStackTrace();
        }
        JLabel lblNewLabel = new MyJLabel(imageIcon);

        lblNewLabel.setBounds(0, 6, 600, 600);
        frame.getContentPane().add(lblNewLabel);

        JButton btnNewButton = new JButton("Pick Image File");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser jfc;
                jfc = new JFileChooser();
                File f = new File(System.getProperty("user.dir"));
                jfc.setCurrentDirectory(f);
                jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                jfc.showOpenDialog(btnNewButton);
                File selFile = jfc.getSelectedFile();

                try {

                    lblNewLabel.setIcon(new ImageIcon(ImageIO.read(new File(selFile.getAbsolutePath()))));
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    System.out.println(selFile.getAbsolutePath());
                    e1.printStackTrace();

                }



            }
        });
我是java的新手,非常感谢您的帮助。谢谢

编辑:以下是MyJLabel的代码:

class MyJLabel extends JLabel
{
    ImageIcon imageIcon;
    public MyJLabel(ImageIcon icon)
    {
        super();
        this.imageIcon = icon;
    }
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(imageIcon.getImage(),0,0,getWidth(),getHeight(),this);
    }
}

这是你的问题,当你打电话的时候

JLabel lblNewLabel = new MyJLabel(imageIcon);
您将图标存储在自己的中,而不是将其传递给超级类。所以当你画画的时候,它会画相机。然后当你打电话时:

lblNewLabel.setIcon(new ImageIcon(ImageIO.read(new File (selFile.getAbsolutePath()))));

实际上,您正在调用超类的setIcon()方法,而不是更改本地存储的图标。然后,super类会画手机,就像它应该画的那样,但你也在画手机上方的摄像头。

当你打电话时,这就是你的问题所在

JLabel lblNewLabel = new MyJLabel(imageIcon);
您将图标存储在自己的中,而不是将其传递给超级类。所以当你画画的时候,它会画相机。然后当你打电话时:

lblNewLabel.setIcon(new ImageIcon(ImageIO.read(new File (selFile.getAbsolutePath()))));

实际上,您正在调用超类的setIcon()方法,而不是更改本地存储的图标。然后,super class会绘制手机,就像它应该绘制的那样,但您也会在上面绘制摄像头。

我测试了这个,它在我的屏幕上看起来很不错。虽然我注意到你正在使用MyJLabel。因为我没有相应的代码,所以只能使用JLabel。所以我会怀疑MyJLabel身上有什么东西。你能提供密码吗?@Brianbcr666Ray嘿,谢谢你的快速回复!我用MyJLabel添加了一个编辑。这样做的目的是缩放图像以适合容器。谢谢<代码>lblNewLabel.setBounds(0,6600600)表示您正在使用
空布局
。请参阅和中的答案,以了解为什么应避免使用它。。。此外,由于您没有改变其行为,因此无需扩展
JLabel
,因此您可以简单地使用
JLabel
,我可能建议您使用Canvas而不是JLabel。@Brianbcr666Ray我不建议将重型组件与轻型容器混合使用,这只会导致更多问题我测试了这个,它在我的屏幕上看起来很好。虽然我注意到你正在使用MyJLabel。因为我没有相应的代码,所以只能使用JLabel。所以我会怀疑MyJLabel身上有什么东西。你能提供密码吗?@Brianbcr666Ray嘿,谢谢你的快速回复!我用MyJLabel添加了一个编辑。这样做的目的是缩放图像以适合容器。谢谢<代码>lblNewLabel.setBounds(0,6600600)表示您正在使用
空布局
。请参阅和中的答案,以了解为什么应避免使用它。。。此外,由于您没有改变其行为,因此无需扩展
JLabel
,因此您可以简单地使用
JLabel
,我可能建议您使用Canvas而不是JLabel。@Brianbcr666Ray我不建议将重型组件与轻型容器混合,这只会导致更多问题