3

我有一个 JPanel,其中包含一个带有 ActionListener 的 JButton。点击一定次数后,需要移除 JButton。但是,当我在其上调用 remove() 时,我得到一个不会消失的按下按钮。

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class SetuPanel extends JPanel {
   private JTextField user = new JTextField();
   private JLabel label = new JLabel();
   private JButton submit = new JButton("Submit");
   private int phase = 0;
   public SetuPanel() {
      super(new FlowLayout());
      user.setPreferredSize(new Dimension(120,22));
      submit.addActionListener(new Submit());
      label.setText("Enter Desired Username:");
      add(label);
      add(user);
      add(submit);
   }
   private void remov(JComponent jc) {
      remove(jc);
      validate();
   }
   private class Submit implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         System.out.println(user.getText());
         if (phase == 2) {
            phase++;
            label.setText("Playing!");
            remov(submit);
         } 
      }
   }
}

有任何想法吗?

4

3 回答 3

5
  • submit.setVisible(false)如果您需要JButton在屏幕上再次看到它,请致电(而是),

  • 你必须打电话给容器revalidate()repaint()

  • JPanel不能直接访问,因为你打电话class extends JPanel,那么你必须打电话

.

remove(jc);
revalidate();
repaint()
于 2012-06-06T13:53:39.277 回答
1

除非您在未发布的代码中对其进行编辑,否则phase只会在 if 块内递增。因此,phase永远不会变成 2。你想phase每次ActionListener调用时都递增吗?

于 2012-06-06T13:56:29.603 回答
1

repaint()只有在调整大小/重新定位/更改面板布局的情况下,才会在屏幕上自动调用该方法(由重绘管理器)。如果添加组件,则它不会自行显示。您必须显式调用repaint()/revalidate()方法以确保组件出现在屏幕上。这并没有错。

我建议您这样做:
要删除:

JPanel.remove(component); // Remove component from your JPanel
JPanel.revalidate();
JPanel.repaint(); // Repaint a JPanel

添加:

JPanel.add(component); // Add component to JPanel
JPanel.revalidate();
JPanel.repaint(); // Repaint a JPanel

你必须把this而不是JPanel工作在你的情况下。

于 2012-06-06T14:39:23.643 回答