Search code examples
javaswingpopupjcomboboxjoptionpane

Simple Java GUI as a popup window and drop-down menu


I never had to write GUI in java. This time I can also skip it and use args as UI (user interface). But I wonder if there is a simple way to create a small GUI to let the user select one of the options. In other words, to implement the askUser() function where user can select from a drop-down menu and press "ok". I spend some time learning this topic, but not even sure that I know which type of GUI i need for this task. JFrame? JPanel? Jmenu? Thanks.

Here is an example of the desired function.

package trygui;

public class Main {

    public static void main(String[] args) {
        String[] choices = new String[]{"cats", "dogs"};
        int choice = askUser(choices);
        System.out.println("selected: " + choices[choice]);
    }

    static int askUser(String[] choices) {
        // create pop-up dialog
        return 0;
    }
}

Update: I use Netbeans, if this can make difference.


Solution

  • The simplest option would be to use the JOptionPane API

    enter image description here

    public class TestOptionPane03 {
    
        public static void main(String[] args) {
            new TestOptionPane03();
        }
    
        public TestOptionPane03() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JPanel panel = new JPanel();
                    panel.add(new JLabel("Please make a selection:"));
                    DefaultComboBoxModel model = new DefaultComboBoxModel();
                    model.addElement("Chocolate");
                    model.addElement("Strewberry");
                    model.addElement("Vanilla");
                    JComboBox comboBox = new JComboBox(model);
                    panel.add(comboBox);
    
                    int result = JOptionPane.showConfirmDialog(null, panel, "Flavor", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                    switch (result) {
                        case JOptionPane.OK_OPTION:
                            System.out.println("You selected " + comboBox.getSelectedItem());
                            break;
                    }
    
                }
            });
        }
    }
    

    You can find out more by having a read through How to Make Dialogs

    UPDATED with feedback

    public class TestOptionPane03 {
    
        public static void main(String[] args) {
            String choice = ask("Chocolate", "Strewberry", "Vanilla");
            System.out.println("You choose " + choice);
        }
    
        public static String ask(final String... values) {
    
            String result = null;
    
            if (EventQueue.isDispatchThread()) {
    
                JPanel panel = new JPanel();
                panel.add(new JLabel("Please make a selection:"));
                DefaultComboBoxModel model = new DefaultComboBoxModel();
                for (String value : values) {
                    model.addElement(value);
                }
                JComboBox comboBox = new JComboBox(model);
                panel.add(comboBox);
    
                int iResult = JOptionPane.showConfirmDialog(null, panel, "Flavor", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                switch (iResult) {
                    case JOptionPane.OK_OPTION:
                        result = (String) comboBox.getSelectedItem();
                        break;
                }
    
            } else {
    
                Response response = new Response(values);
                try {
                    SwingUtilities.invokeAndWait(response);
                    result = response.getResponse();
                } catch (InterruptedException | InvocationTargetException ex) {
                    ex.printStackTrace();
                }
    
            }
    
            return result;
    
        }
    
        public static class Response implements Runnable {
    
            private String[] values;
            private String response;
    
            public Response(String... values) {
                this.values = values;
            }
    
            @Override
            public void run() {
                response = ask(values);
            }
    
            public String getResponse() {
                return response;
            }
        }
    }