2012-02-17 48 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