web-dev-qa-db-ja.com

Javaのシンプルなドロップダウンメニュー

私はJavaで非常にシンプルなGUIに取り組んでいます。

このGUIで表示したいものは次のとおりです。

  1. ページの上部にテキストがあるラベル
  2. 上記のラベルの下のJComboBox
  3. 上記のJComboBoxの下のJButton

ここに私のコードがあります:

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Prova {

public static void main(String[] args) {

    JFrame frame = new JFrame("A Simple GUI");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocation(430, 100);

    JPanel panel = new JPanel();

    frame.add(panel);

    JLabel lbl = new JLabel("Select one of the possible choices and click OK");
    lbl.setVisible(true);

    panel.add(lbl);

    String[] choices = { "CHOICE 1","CHOICE 2", "CHOICE 3","CHOICE 4","CHOICE 5","CHOICE 6"};

    final JComboBox<String> cb = new JComboBox<String>(choices);

    cb.setVisible(true);
    panel.add(cb);

    JButton btn = new JButton("OK");
    panel.add(btn);

    }
}

残念ながら、私が得る結果は

image

画像でわかるように、ラベル、JComboBox、およびJButtonは同じ行にあります!

代わりに、上記のように「スタック」する必要があります。

JLabel

JComboBox

JButton

SetLocation(int x、int y)メソッドを使用してみましたが、常に同じ位置に表示されます。

どうもありがとう!

10
NoobNe0

frame.setLayout(null);を使用すると、ラベル、ボタンなどを好きな場所に配置できます

6
Nerakai

Java標準レイアウト(GridLayout、LinearLayout、BoxLayout)のいずれかを使用する必要があります。

1列3行のグリッドレイアウトを使用することをお勧めします

以下のような

  setLayout(new GridLayout(1,3));
         add(new Button("1"));
         add(new Button("2"));
         add(new Button("3"));
4
Ahmed Salem

これは、子を配置するために使用されるレイアウトによるものです。デフォルトでは、フロー内のすべての子コンポーネントを左から右に配置するFlowLayoutにより、上記の表示が得られます。

必要に応じて、3行1列のGridLayoutを使用できます。

GridLayout

すべてのレイアウト

3
Atul O Holic

あなたの質問を理解したなら、次のコードはあなたがやろうとしていることを過度に複雑にすることなく達成します:

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BoxLayout; // added code
import Java.awt.Component; // added code

public class Prova {

public static void main(String[] args) {

    JFrame frame = new JFrame("A Simple GUI");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocation(430, 100);

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // added code

    frame.add(panel);

    JLabel lbl = new JLabel("Select one of the possible choices and click OK");
    lbl.setAlignmentX(Component.CENTER_ALIGNMENT);
    //lbl.setVisible(true); // Not needed

    panel.add(lbl);

    String[] choices = { "CHOICE 1", "CHOICE 2", "CHOICE 3", "CHOICE 4",
                         "CHOICE 5", "CHOICE 6" };

    final JComboBox<String> cb = new JComboBox<String>(choices);

    cb.setMaximumSize(cb.getPreferredSize()); // added code
    cb.setAlignmentX(Component.CENTER_ALIGNMENT);// added code
    //cb.setVisible(true); // Not needed
    panel.add(cb);

    JButton btn = new JButton("OK");
    btn.setAlignmentX(Component.CENTER_ALIGNMENT); // added code
    panel.add(btn);

    frame.setVisible(true); // added code

    }
}

setLocationメソッドは、レイアウトに非常に具体的な(芸術的?)目標がない限り、非常に複雑になることがよくあります。この問題に対する簡単な解決策は、BoxLayoutを使用し、y方向に追加することを指定することです(垂直に下向き)。JComboBox(およびその他のGUI要素の寸法を指定する必要があることに注意してください。後で追加したい)巨大なドロップダウンメニューを避けるために。 cf.別のstackoverflow投稿、 JComboBox幅

2
bballdave025

レイアウトマネージャーの使用に関するチュートリアルを学習してください。ここで解決策を見つけることができます。しかし、彼らはかなり厳しいです。

1
Taerus