【问题标题】:JButton not removing properlyJButton 没有正确移除
【发布时间】:2012-06-06 13:48:24
【问题描述】:

我有一个 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);
         } 
      }
   }
}

有什么想法吗?

【问题讨论】:

  • 1) 使用CardLayout。 2) 为了尽快获得更好的帮助,请发帖SSCCE

标签: java swing jbutton


【解决方案1】:
  • 调用submit.setVisible(false)(更确切地说),如果您需要在屏幕上再次看到这个JButton

  • 你必须调用容器revalidate()repaint()

  • JPanel不能直接访问,因为你调用class extends JPanel,那么你必须调用

.

remove(jc);
revalidate();
repaint()

【讨论】:

  • 我试过了。我仍然遇到同样的问题。即使使用 submit.setVisible(false)
  • 会不会是ActionListener绑定提交的缘故?
  • 调用 this.relidate 和 this.repaint 时发生了什么
  • 这家伙是对的,当你从 JPanel 中移除一个组件时,你需要调用 .validate() 方法。之后你也可以调用 repaint()。
  • 我仍然遇到同样的问题。我找不到关于为什么按钮不会消失的明显原因。附带说明一下,如果我尝试调试面板然后单击按钮,则会发生相同的错误。
【解决方案2】:

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

【讨论】:

  • 它正在递增,我删掉了那个代码,因为我觉得它无关紧要
【解决方案3】:

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 才能在您的情况下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2021-02-22
    • 2018-03-27
    • 2019-04-23
    • 2020-08-31
    • 2019-04-13
    • 2012-04-27
    相关资源
    最近更新 更多