有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

所以我必须创建一个JLabel和一个JButton,把它们放到一个JPanel中,然后在一个JFrame中显示它们。单击JButton时,必须删除JButton,并更改JLabel的文本。这一切都很好,除了一件事:当按钮从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);
    }
}

有没有关于如何解决这个问题的建议?谢谢


共 (2) 个答案

  1. # 1 楼答案

    试试这个:

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

    这将在删除配电盘后重新绘制配电盘,并设置可见性

  2. # 2 楼答案

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

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