0

我有这段代码并阅读了validate可以指的是布置容器的子组件。“布局相关的更改,例如设置组件的边界,或将组件添加到容器中会自动使容器失效。” (来源:javadoc)。

但是,我认为保留validate()或从这段代码中删除它之间没有任何区别。你能给我一个令人信服的例子,你可以在两种情况下(有或没有验证)看到不同的行为来证明一个观点吗?任何其他意见/建议表示赞赏。

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);
    }
}
4

2 回答 2

2

如果在面板初始化并使其可见后将组件添加到面板,则需要调用它。

尝试向您的小程序添加一个按钮,然后单击该按钮,为小程序添加一个新标签。

于 2012-12-27T13:54:05.600 回答
2

我将引用 API:

validate 方法用于使容器重新布置其子组件。在容器显示后修改此容器的子组件(添加到容器或从容器中删除,或更改布局相关信息)时,应调用它。

如您所见,如果您在初始化后修改布局,这一点很重要。这就是为什么你看不到任何区别的原因

顺便说一句:这是你的例子:

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();
}
}
于 2012-12-27T13:55:53.150 回答