0

私はこのコードを持っており、validateがコンテナのサブコンポーネントのレイアウトを参照できることを読みました。「コンポーネントの境界の設定やコンテナへのコンポーネントの追加など、レイアウト関連の変更により、コンテナが自動的に無効になります。」(ソース:javadoc)。

ただし、validate()を保持することと、この小さなコードから削除することの間に違いはありません。ポイントを証明するために、2つのケース(検証ありまたはなし)で明確な動作を確認できる説得力のある例を教えてください。その他のコメント/アドバイスをいただければ幸いです。

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を引用します:

検証メソッドは、コンテナにそのサブコンポーネントを再度レイアウトさせるために使用されます。コンテナーが表示された後に、このコンテナーのサブコンポーネントが変更された (コンテナーに追加またはコンテナーから削除された、またはレイアウト関連の情報が変更された) 場合に呼び出す必要があります。

ご覧のとおり、初期化後にレイアウトを変更することが重要です。それが違いが見えない理由です

ところで:ここにあなたの例があります:

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 に答える