JButton 在被删除后在 JPanel 中留下工件?

JButton leaving artifacts in JPanel after being removed?

所以我必须创建一个JLabel和一个JButton,将它们放入一个JPanel,然后将它们全部显示在一个JFrame中。必须删除 JButton,并且 JLabel 的文本会在单击 JButton 时更改。一切正常,除了一件事:当按钮从 JPanel 中移除时,它仍然留下了自己的工件。这是我的代码,您自己试试吧:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestClass
{
    public static void main (String[] args)
    {
        new TestClass();
    }

    public TestClass()
    {
        JPanel jpanel = new JPanel();
        JLabel jlabel = new JLabel ("-->");
        JButton jbutton = new JButton ("Click here!");

        jbutton.addActionListener (new ActionListener()
        {
            public void actionPerformed (ActionEvent event)
            {
                jlabel.setText ("Good job!");
                jpanel.remove (jbutton);
            }
        });

        jpanel.add (jlabel);
        jpanel.add (jbutton);

        JFrame jframe = new JFrame ("Test Frame");
        jframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        jframe.setSize (340, 60);
        jframe.setResizable (false);
        jframe.add (jpanel);
        jframe.setVisible (true);
    }
}

关于如何解决这个问题有什么建议吗?谢谢。

试试这个:

jlabel.setText ("Good job!");
jbutton.setVisible (false);
jpanel.remove (jbutton);
jpanel.repaint();

这会在移除面板后重新绘制面板,并关闭可见性。

当您删除 Swing 组件时,您应该在其容器上调用 revalidate() 然后 repaint()

public void actionPerformed(ActionEvent event) {
    jlabel.setText("Good job!");
    jpanel.remove(jbutton);
    jpanel.revalidate();
    jpanel.repaint();
}