我有一个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);
}
}
}
}
任何想法?
答案 0 :(得分:5)
如果您需要在屏幕上再次显示此submit.setVisible(false)
,请致电JButton
(相反),
您必须致电容器revalidate()
和repaint()
JPanel
无法直接访问,因为您致电class extends JPanel
,然后您必须致电
remove(jc);
revalidate();
repaint()
答案 1 :(得分:1)
除非您在未发布的代码中编辑它,否则phase
仅在if块内增加。因此,phase
永远不会变为2.您是否希望每次调用phase
时都递增ActionListener
?
答案 2 :(得分: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
来处理您的工作。