我有这段代码,并且读到验证可以引用布局容器的子组件。 “与布局相关的更改,例如设置组件的边界,或将组件添加到容器,自动使容器无效。” (来源:javadoc)。
但是,在保持验证()或将其从这一小段代码中删除之间,我看到没有区别。 你能告诉我一个令人信服的例子,你可以在两种情况下(有或没有验证)看到不同的行为来证明一个观点吗?任何其他意见/建议表示赞赏。
public class Sw1
extends JApplet
{
JLabel lbl;
public void init()
{
lbl = new JLabel ("a label");
JPanel pan = (JPanel) getContentPane ();
pan.add(lbl);
validate();
}
}
这是我打算按下按钮添加标签后的程序。按下按钮时会出现异常:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class Sw_test
extends JApplet
implements ActionListener
{
JLabel lbl;
JButton bt ;
JPanel pan ;
JLabel l;
public void init()
{
lbl = new JLabel ("label 1");
bt = new JButton ("go ahead, press me");
bt.addActionListener(this);
JPanel pan = (JPanel) getContentPane ();
pan.setLayout(new FlowLayout());
pan.add(lbl);
pan.add(bt);
validate();
}
public void actionPerformed(ActionEvent ev)
{
l = new JLabel("new label");
pan.add(l);
}
}
答案 0 :(得分:2)
如果在初始化并显示之后向面板添加组件,则需要调用它。
尝试向applet添加一个按钮,然后点击该按钮,向applet添加一个新标签。
答案 1 :(得分:2)
我将引用API:
validate方法用于使容器再次布置其子组件。在显示容器后修改此容器的子组件(添加到容器中或从容器中删除,或更改布局相关信息)时,应调用它。
如您所见,在初始化之后修改布局非常重要。 这就是你没有看到任何差异的原因
btw:这是你的例子:
public class TestFrame extends JFrame{
private JButton b = new JButton();
public TestFrame() {
this.setLayout(new GridLayout(5,5));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(b);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TestFrame.this.add(new JLabel("whatever"));
//try it with and without
//validate();
}
});
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String[] args) {
new TestFrame();
}
}