Simple Dropdown menu in Java

I am working on a very simple GUI in Java.

In this GUI I want to display:

  1. A label with some text on the top of the page
  2. A JComboBox under the mentioned label
  3. A JButton under the mentioned JComboBox

Here's my code:

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

    }
}

Unfortunately, the result I get is

As you can see in the image, the label, the JComboBox and the JButton are on the same line!

Instead, I want them "stacked" as described above:

JLabel

JComboBox

JButton

I tried using the setLocation(int x, int y) method, but they always show in the same position.

Many thanks!

Answers


use frame.setLayout(null); this will allow you to place the Label, Button etc. where you like


You should use one of Java standard Layout (GridLayout, LinearLayout, BoxLayout)

I recommend to use a grid layout with 1 column and 3 rows

like below

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

It is due to the Layout which is used to align the children. By default its FlowLayout which lays all the child components in a flow starting from left to right and hence you getting the above display.

You can use is a GridLayout with 3 rows and 1 column as per your requirement.

GridLayout

All Layouts


If I've understood your question, the following code accomplishes what you are trying to do without being overly complicated:

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

    }
}

The setLocation method is often overly complicated unless you have very specific (artistic?) goals for the layout. For this problem, an easier solution is to use a BoxLayout and specify that you want things added in the y-direction (vertically downwards.) Note that you will have to specify the dimensions of the JComboBox (and some other GUI elements that you might want to add later) to avoid a giant drop-down menu. cf. another stackoverflow post, JComboBox width


Study some tutorials on using layout managers, that's where you'll find the solution. They are pretty tough though.


Need Your Help

Data Grid for Angular 2

angular grid ngtable

What data grid should be used for an Angular 2 project if performance is a concern?