Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

Simple Dropdown menu in Java

Writer Mia Lopez

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

image

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!

6 Answers

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

2

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

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

2

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

use Panel.setLayout(null); and use setBounds to every component to place them according to your choice eg:

JButton btn=new JButton("Press");
btn.setBounds(10, 10, 100, 20);//where(x, y, length, height)
JPanel.add(btn);//this is just a snippet, you will have to declare an object
//for the JPanel:)

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy