7

コンポーネントを特定の位置に配置する方法。3つのコンボボックスの下の最初の行に2つのテキストボックスを配置したいように。

しかし、それらをすべて 1 行に表示しようとすると、flowlayout を使用しました。縁も利用しました。サイズを変更すると、コンポーネントのウィンドウ サイズが境界からはみ出します。

おすすめのレイアウトと使い方を教えてください。

これが私のコードです:

topPanel=new JPanel();
topPanel.setLayout(new FlowLayout());
topPanel.setBorder(new TitledBorder(new EtchedBorder(), "Customer Data"));

CNameTextField = new JTextField (20); // create the Customer Name text field
CNameTextField.setEditable(true);     // set editable text box

CIDLabel=new JLabel("Customer ID");

C_IDTextField = new JTextField (10);
C_IDTextField.setEditable(true);      // set editable text box

topPanel.add(CNameTextField);
topPanel.add(C_IDTextField);   

// Create and populate Room type combo box
roomTypeCombo = new JComboBox();
roomTypeCombo.addItem( "Budget($50)" );    

// Create and populate Meal type combo box
mealCombo = new JComboBox();
mealCombo.addItem( "None" );       

// Create and populate Days combo box

daysCombo = new JComboBox();

for(int i=0;i<31 ; i++) {
            // populate combobox with days
    daysCombo.addItem(i); 
}
    // Adding  rest of the components to top panel
topPanel.add(roomTypeCombo);
topPanel.add(mealCombo);
topPanel.add(daysCombo);

ありがとう。

4

2 に答える 2

8

レイアウトの最も具体的なタイプは、絶対配置です。

警告:絶対配置は、たとえあったとしてもめったに使用しないでください。理由はたくさんあります。1 つ:絶対配置 (レイアウト マネージャーなし) と MiGlayout での絶対配置 -警告を追加するという良いアイデアを提供して

くれたユーザーbrimboriumに感謝します。

そうは言っても、絶対配置を使用する方法は次のとおりです。

上記のコードで、topPanelのレイアウトをFlowLayoutに設定する代わりに、 に設定しnullます。

topPanel.setLayout(null);

コードの後半で、コンポーネントを に追加する直前にtopPanel、コンテナのsetBoundsメソッドを呼び出します。

someJComponent.setBounds(x-coord, y-coord, width, height);

たとえば、 のインスタンスを作成しJComboBox()て名前を付けたroomTypeCombo場合、次のコードは を絶対に配置する方法を示していますroomTypeCombo

topPanel.setLayout(null);

// code...

roomTypeCombo = new JComboBox();

// code...

roomTypeCombo.setBounds(100, 100, 200, 50);
topPanel.add(roomTypeCombo);

上記setBoundsで使用したメソッドには、次の 4 つのパラメーターがあります。

  • int x-coord-roomTypeCombo親を基準とした の x 座標を設定しtopPanelます。
  • int y-coord-roomTypeCombo親を基準とした の y 座標を設定しtopPanelます。
  • int width-roomTypeComboの幅を指定します。
  • int height-roomTypeComboの高さを指定します。


座標をいじって、そこから出てくるものが気に入るかどうかを確認します. 起こりうる最悪の事態は、レイアウトの使用に戻ることです。これは、おそらく絶対配置よりも優れています。または、独自のレイアウト マネージャーを実装することもできます。このハイパーリンクをたどると、最初の回答で独自のレイアウト マネージャーの実装について説明し、役立つリンクが表示されます。

絶対配置の詳細

于 2012-04-04T17:52:02.497 に答える
6

レイアウトを変更してみてください。 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

GridLayoutそれぞれ 3 つの JComboBox と 2 つの JTextField を含む 2 行 (たとえば、他にも可能な組み合わせがいくつかあります) を使用できます。

ドキュメントを注意深く見て、Web 上で簡単にアクセスできるいくつかの例を確認してください。

import java.awt.GridLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SwingResizeJFrame {

    public SwingResizeJFrame() {
        JTextField TextField1 = new JTextField("firstTextField");
        JTextField TextField2 = new JTextField("secondTextField");
        JPanel firstPanel = new JPanel();
        firstPanel.setLayout(new GridLayout(0, 2, 10, 10));
        firstPanel.add(TextField1);
        firstPanel.add(TextField2);

        JComboBox comboBox1 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JComboBox comboBox2 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JComboBox comboBox3 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JPanel secondPanel = new JPanel();
        secondPanel.setLayout(new GridLayout(0, 3, 10, 10));
        secondPanel.add(comboBox1);
        secondPanel.add(comboBox2);
        secondPanel.add(comboBox3);

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 1, 10, 10));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(firstPanel);
        frame.add(secondPanel);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                SwingResizeJFrame demo = new SwingResizeJFrame();
            }
        });
    }
}
于 2012-04-04T16:23:13.010 に答える