2012-02-17 52 views
3

我正在研究一個小的Java小程序,這個編程的東西非常新。使用Java 1.6Java圖形不顯示變化

我有一個類創建了多個複選框的JPanel。我們的目標是讓用戶選擇的選項一些固定的號碼,然後通過這些選項,以其他方法

public class OptionSelector extends JPanel { 

private JCheckBox[] optionCheckBoxes; 
private int numberSelected; 
private int goalNumber; 
private ArrayList<String> selectedOptions = new ArrayList<String>(); 
private boolean rightAmountSelected; 
private boolean isFinalChoice = false; 
private DoneButton done = new DoneButton(); 

/** 
* This method is used only for the purposes of initialization 
* 
*/ 
public OptionSelector() 
{ 
    this(1, "test", "test"); 
} 

public OptionSelector(int howManyToSelect, String ... options) 
{ 
    super(new FlowLayout()); 
    JCheckBox option; 
    optionCheckBoxes = new JCheckBox[options.length]; 
    for (int i = 0; i < options.length; i++) 
    { 
     option = new JCheckBox(options[i]); 
     optionCheckBoxes[i] = option; 
     add(option); 
    } 
    add(done); 
    numberSelected = 0; 
    goalNumber = howManyToSelect; 
    rightAmountSelected = false; 
} 

public void setOptions(String ... options) 
{ 
    this.removeAll(); 
    JCheckBox option; 
    optionCheckBoxes = new JCheckBox[options.length]; 
    for (int i = 0; i < options.length; i++) 
    { 
     option = new JCheckBox(options[i]); 
     optionCheckBoxes[i] = option; 
     add(option); 
     System.out.println(option.getBounds()); 
    } 
    add(done); 
    System.out.println(done.getBounds()); 
} 

public void paintComponent(Graphics g) 
{ 
    g.clearRect(0,0,this.getWidth(), this.getHeight()); 
    for (int i = 0; i < getComponentCount(); i++) 
    { 
     System.out.println(this.getComponents()[i].getBounds()); 
    } 
} 

,我用來測試它低於

public class TestDisplay extends JApplet implements MouseListener{ 

OptionSelector s = new OptionSelector(); 

public void init() 
{ 
    setSize(640,480); 
    this.getContentPane().setLayout(null); 
    addMouseListener(this); 
    s.setBounds(10,10,200,200); 
    add(s); 
    s.repaint(); 
} 

public void paint(Graphics g) 
{ 
    s.repaint(); 
} 

public void mouseClicked(MouseEvent arg0) 
{ 
    s.setOptions("1","2"); 
    repaint(); 
} 

public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

} 

的問題是,當小程序我測試小程序,單擊鼠標更改選項就好了,但不會顯示新的JCheckBoxes。嘗試在選擇器中打印出每個組件的邊界,表明JCheckBox邊界仍然停留在(0,0,0,0)處,而按鈕的邊界沒有改變。我試過多次重繪OptionSelector和整個小程序,但似乎沒有任何工作。有想法該怎麼解決這個嗎?

回答

5

你似乎忘了刪除和添加組件時調用revalidate()您的JPanel容器上:

public void mouseClicked(MouseEvent arg0) { 
    s.setOptions("1", "2"); 
    s.revalidate(); 
    repaint(); 
} 

,如果你想在容器(您的JPanel)在容器中適當佈局新組件這是必不可少的。此外,這是不是做一件好事:

public void paint(Graphics g) { 
    s.repaint(); 
} 

,你要覆蓋一個頂級組件的毫無理由,沒有調用父類方法paint方法。只是擺脫這種方法。

+0

謝謝,解決了這個問題就好了。 – Titandrake 2012-02-18 00:13:54

+0

當你有機會時,請[接受](http://meta.stackexchange.com/a/65088/155831)答案。 – 2012-02-18 02:46:13