0

私は自分のコードで次の呼び出しを行っています:

...
setLayout(null);
...

x座標とy座標を指定して、ボタンとテキストフィールドを配置しようとしています。

プログラムを (Eclipse または BlueJ で) 実行するときの問題は、ボタンとテキストフィールドをそれぞれ表示するために、ボタンとテキストフィールドの位置までパネルで実行する必要があることです。

テキストフィールドを見つけると、小さいです。書き始めたときだけ、指定したサイズになります。

誰もそれを解決する方法を知っていますか?

4

2 に答える 2

7
  1. 非常に正当な理由がない限り、setLayout(null)は避けてください。レイアウトマネージャについては、http: //docs.oracle.com/javase/tutorial/uiswing/layout/using.htmlで学ぶことができます。

  2. それでもヌルレイアウトを使用する場合は、xとyの位置だけでなく、コンポーネントの幅と高さを設定する必要があります(setSizeメソッドを参照)。

上記のリンクから:

レイアウトマネージャーを使用することを強くお勧めしますが、レイアウトマネージャーなしでレイアウトを実行できます。コンテナのレイアウトプロパティをnullに設定すると、コンテナはレイアウトマネージャを使用しなくなります。絶対配置と呼ばれるこの戦略では、そのコンテナ内のすべてのコンポーネントのサイズと位置を指定する必要があります。絶対配置の欠点の1つは、最上位のコンテナーのサイズが変更されたときにうまく調整されないことです。また、フォントサイズやロケールの違いなど、ユーザーとシステムの違いにもうまく適応しません。

于 2012-09-06T21:43:39.753 に答える
3

setBoundsメソッドの代わりにメソッドを使用することをお勧めしますsetLocation

    JTextField tf = new JTextField(10);
    Dimension d = tf.getPreferredSize();
    tf.setBounds(x, y, d.width, d.height);

もちろん、null レイアウト マネージャーを使用している場合は、preferredSize. すべての主要な側面を組み込んだ例を次に示します。

import java.awt.*;
import javax.swing.*;

public class TestProject extends JPanel{

    public TestProject(){
        super(null);

        JTextField tf = new JTextField(10);
        add(tf);

        Dimension d = tf.getPreferredSize();        
        tf.setBounds(10, 20, d.width, d.height);

    }

    @Override
    public Dimension getPreferredSize(){
        //Hard coded preferred size - but you'd probably want 
        //to calculate it based on the panel's content 
        return new Dimension(500, 300);
    }

    public static void main(String args[])
    {


        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TestProject());    
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
于 2012-09-06T21:54:32.047 に答える