Nunca he tenido que escribir GUI en java. Esta vez también puedo saltar y utilizar args como UI (interfaz de usuario).
Pero me pregunto si hay una manera sencilla de crear una pequeña interfaz gráfica de usuario para permitir que el usuario seleccione una de las opciones.
En otras palabras, para implementar el askUser() función en la que el usuario puede seleccionar de un menú desplegable y pulse el botón «aceptar».
Puedo pasar algún tiempo aprendiendo de este tema, pero no está seguro de que sé que tipo de GUI necesito para esta tarea. JFrame? JPanel? Jmenu? Gracias.

Aquí es un ejemplo de la función deseada.

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

Actualización: yo uso Netbeans, si esto puede hacer la diferencia.

InformationsquelleAutor Serg | 2012-11-15

3 Comentarios

  1. 14

    La opción más sencilla sería utilizar el JOptionPane API

    Simple GUI de Java como una ventana emergente y menú desplegable

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

    Usted puede encontrar más información al tener una lectura a través de Cómo Hacer cuadros de diálogo

    ACTUALIZA con comentarios de

    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;
    }
    }
    }
    • Gracias. Pero necesitaba el resultado en el main(). He encontrado una solución con JOptionPane. Pero sólo para entender, ¿cómo podría obtener el resultado String en el main() si puedo usar su solución?
    • El problema que tienes no es tu intento de acceso a la interfaz de usuario de lado el Caso de Envío de Hilo (como main no se inicia dentro de la EDT). Esto trae una serie de problemas. La comprobación de actualización para su posible solución. La verdadera solución sería el uso de SwingUtilties#invokeLater en el main método para conseguir que en el EDT y continuar lanzando el resto de la aplicación no
    • gracias por la actualización.
    • href=»http://stackoverflow.com/a/12643642/714968″>para notificado acerca de subproceso inicial en otra respuesta aquí
  2. 2

    Si quieres crear un Swing GUI, el uso de un IDE como NetBeans le da la sencillez de uso de un WYSIWYG gui designer, así que usted puede simplemente arrastrar y soltar los elementos de la GUI en su lugar, y luego agregar su código de lógica de alrededor del código de la GUI que NetBeans salidas.

    Ciertamente no es algo que se basan en «construir la interfaz gráfica de usuario para usted», pero hacen un gran trabajo de configuración de la base para trabajar con. También se puede aprender mucho sobre el Swing sólo por la lectura a través de trabajo y con el código que NetBeans genera para la interfaz gráfica de usuario.

    Esto me parece un gran acelerador en introducción al diseño de aplicaciones Swing.

  3. 2

    Después de preguntar he encontrado esta solución. Para hacerlo más simple, el askUser() devuelve String.

    package trygui;
    import javax.swing.JOptionPane;
    public class Main {
    public static void main(String[] args) {
    String[] choices = new String[]{"cats", "dogs"};
    String choice = askUser(choices);
    System.out.println("selected: " + choice);
    }
    static String askUser(String[] choices) {
    String s = (String) JOptionPane.showInputDialog(
    null,
    "make your choice",
    "Try GUI",
    JOptionPane.PLAIN_MESSAGE,
    null,
    choices,
    choices[0]);
    return s;
    }
    }

    Simple GUI de Java como una ventana emergente y menú desplegable

    • NUNCA crear y/o modificar CUALQUIER COMPONENTE de interfaz de usuario de lado el Caso de Envío de Hilo, es una mala práctica y conducirá por una pendiente resbaladiza de la frustración y de la calvicie (como usted rasgar su pelo)
    • He leído acerca de la EDT en la wiki, y debo admitir que no entiendo a qué problemas puede que esta solución causa una tarea sencilla. ¿Puede dar un ejemplo en el que falla?
    • El principal problema es que usted puede terminar para arriba con sucio pinturas o mutar excepciones (como un modelo de comenzar actualizado por dos hilos simultáneamente). Si bien es un simple ejemplo, es una mala práctica, una práctica que si no se toman las molestias de erradicar, va a volver y vengarse en formas que son difíciles de depurar (hola Hilo de la raza y de interbloqueo de problemas)
    • Para un ejemplo en el que falla, crear usted mismo JTable con una fila clasificador. El uso de una tabla personalizada modelo, rellenar desde el exterior de la EDT, permitiendo que el modelo a fuego eventos de actualización. También puede intentar y conseguir dos o más subprocesos para la actualización de un área de texto (utilizando intervalos aleatorios) como un par de ejemplos sé
    • href=»http://stackoverflow.com/a/12643642/714968″>no hay problema para la simulación de EDT carece aquí

Dejar respuesta

Please enter your comment!
Please enter your name here