带/不带validate()的Java JApplet

时间:2012-12-27 13:51:08

标签: java swing layout-manager

我有这段代码,并且读到验证可以引用布局容器的子组件。 “与布局相关的更改,例如设置组件的边界,或将组件添加到容器自动使容器无效。” (来源: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);
    }
}

2 个答案:

答案 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();
}
}