2012-06-06 49 views
3

我有一個包含JButton和ActionListener的JPanel。點擊一定次數後,需要刪除JButton。但是,當我調用remove()時,我得到一個不會消失的按鈕。JButton沒有正確移除

這裏是我的代碼:

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

1)使用'CardLayout'。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

5
  • 呼叫submit.setVisible(false)(寧)在你要打電話容器revalidate()repaint(),你會需要這種JButton在屏幕上再次可見的情況下,

  • JPanel不直接因爲您致電class extends JPanel,因此您必須致電

remove(jc); 
revalidate(); 
repaint() 
+0

我試過了。我仍然遇到同樣的問題。即使使用submit.setVisible(false) – Zwade

+0

是否因爲ActionListener被綁定提交? – Zwade

+0

什麼發生了,當你打電話this.relidate和this.repaint – mKorbel

1

除非您在代碼中編輯它沒有發佈,phase只在if區塊內增加。因此,phase將永遠不會變爲2.您是否每次調用ActionListener時都想遞增phase

+0

它正在增加,我刪除了代碼,因爲我覺得它不是相關的 – Zwade

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在你的情況下工作。