2012-04-10 104 views
0

我试图动态地将一些组件添加到JPanel,但不幸的是它们没有出现。我只看到了在构造函数中添加的那些。动态添加组件到JPanel

更新版本(添加新JPanel,所有的组件会):

public class View extends JPanel { 

JPanel panel = new JPanel(); 
JLabel label; 
JLabel labels[]; 
JButton b1 = new JButton("OK"); 

public View() { 
    this.setLayout(new FlowLayout()); 
    this.add(panel); // adding a new JPanel 
    label = new JLabel("My label"); 
    panel.add(label); // adding label to the new panel (this one works) 
} 


public void showLabels() { 
    System.out.println("function showLabels called"); 

    labels = new JLabel[5]; 

    for (int i = 0; i < 5; i++) { 
     labels[i] = new JLabel("Label: " + i); 
     panel.add(labels[i]); // this one doesn't work 
    } 
    panel.add(b1); // this one doesn't work, too 
    this.validate(); // validating this class (parent container) 
    panel.validate(); // validating the panel, where all the components are 
    } 
} 

可惜的是没有什么改变。

+1

你尝试调用'包()'父'JFrame'? – Jack 2012-04-10 17:21:21

+0

还没有。仅仅调用revalidate()或其他的东西是不够的? – user1170330 2012-04-10 17:22:26

+0

JPanel的布局是什么?一些组件可以在一些布局中重叠,如BorderLayou。尝试BoxLayout或FlowLayout。 – elias 2012-04-10 17:50:33

回答

4

在父容器上调用validate(),如Nested Layout Example所示。动态添加左下方的标签。请注意,调用pack()可能会导致GUI的大小发生变化,而调用validate()则不会。如果您需要需要才能调整GUI的大小 - 请致电pack(),否则请致电validate()

+0

即使我将所有组件放在第一个JPanel上,然后将新JPanel放在第一个(父级)JPanel“View”并重新验证并重新绘制两者,但没有任何更改... – user1170330 2012-04-10 18:18:28

+0

为了更快地获得更好的帮助, SSCCE](http://sscce.org/)竭尽全力。 – 2012-04-10 18:30:10

+0

*“重新验证并重新绘制”* ..请注意,我提到了这两种方法中的任何一种(理由很充分)。也许你正在考虑mre的答案(现在已经被删除)。 – 2012-04-10 18:31:30