Pregunta JOptionPane.showMessageDialog ¿espera hasta que se haga clic en Aceptar?


Esto podría ser algo muy simple que estoy pasando por alto, pero parece que no puedo resolverlo.

Tengo el siguiente método que actualiza un JTable:

class TableModel extends AbstractTableModel {    
        public void updateTable() {
            try {
                // update table here
             ...
    } catch (NullPointerException npe) {
                isOpenDialog = true;
                JOptionPane.showMessageDialog(null, "No active shares found on this IP!");
                isOpenDialog = false;
            }
        }
    }

Sin embargo, no quiero isOpenDialog boolean se establecerá en falso hasta que se presione el botón Aceptar en el cuadro de diálogo del mensaje, ya que si un usuario presiona intro, se activará un KeyListener evento en un campo de texto y desencadena ese bloque completo de código si está configurado para false.

Parte del código KeyListener se muestra a continuación:

public class KeyReleased implements KeyListener {
        ...

    @Override
    public void keyReleased(KeyEvent ke) {
        if(txtIPField.getText().matches(IPADDRESS_PATTERN)) {
            validIP = true;
        } else {
            validIP = false;
        }

        if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
            if (validIP && !isOpenDialog) {
                updateTable();
            }
        }
    }
}

Hace JOptionPane.showMessageDialog() ¿Tiene algún tipo de mecanismo que impide ejecutar la siguiente línea hasta que se presiona el botón OK? Gracias.


5
2018-06-09 22:54


origen


Respuestas:


JOptionPane crea un cuadro de diálogo modal y, por lo tanto, la línea que está más allá no se llamará hasta que se haya tratado el diálogo (cualquiera de los botones se ha pulsado o se ha presionado el botón Cerrar menú).

Más importante aún, no debería usar un KeyListener para este tipo de cosas. Si desea que JTextField escuche para presionar la tecla Enter, agregue un ActionListener a ella.


10
2018-06-10 00:17



Un trabajo fácil para satisfacer sus necesidades es el uso de showConfirmDialog (...), encima showMessageDialog(), esto le permite tomar la entrada del usuario y luego proceder de la misma manera. Eche un vistazo a este programa de ejemplo, para aclarar :-)

import javax.swing.*;

public class JOptionExample
{
    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                int selection = JOptionPane.showConfirmDialog(
                                null
                        , "No active shares found on this IP!"
                        , "Selection : "
                        , JOptionPane.OK_CANCEL_OPTION
                        , JOptionPane.INFORMATION_MESSAGE);
                System.out.println("I be written" +
                     " after you close, the JOptionPane");      
                if (selection == JOptionPane.OK_OPTION)
                {
                    // Code to use when OK is PRESSED.
                    System.out.println("Selected Option is OK : " + selection);
                }
                else if (selection == JOptionPane.CANCEL_OPTION)
                {
                    // Code to use when CANCEL is PRESSED.
                    System.out.println("Selected Option Is CANCEL : " + selection);
                }
            }           
        });
    }
}

7
2018-06-10 04:16



You can get acces to the OK button if you create optionpanel and custom dialog. Here's an example of this kind of implementation:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author OZBORN
 */
public class TestyDialog {
    static JFrame okno;
    static JPanel panel;
    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        zrobOkno();
        JButton przycisk =new JButton("Dialog");
        przycisk.setSize(200,200);
        panel.add(przycisk,BorderLayout.CENTER);
        panel.setCursor(null);
        BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        przycisk.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
                            cursorImg, new Point(0, 0), "blank cursor"));
        final JOptionPane optionPane = new JOptionPane(
                "U can close this dialog\n"
                + "by pressing ok button, close frame button or by clicking outside of the dialog box.\n"
                +"Every time there will be action defined in the windowLostFocus function"
                + "Do you understand?",
                JOptionPane.INFORMATION_MESSAGE,
                JOptionPane.DEFAULT_OPTION);

        System.out.println(optionPane.getComponentCount());
        przycisk.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                final JFrame aa=new JFrame();
                final JDialog dialog = new JDialog(aa,"Click a button",false);
                ((JButton)((JPanel)optionPane.getComponents()[1]).getComponent(0)).addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        aa.dispose();
                    }
                });
                dialog.setContentPane(optionPane);
                dialog.pack();

                dialog.addWindowFocusListener(new WindowFocusListener() {
                    @Override
                    public void windowLostFocus(WindowEvent e) {
                        System.out.println("Zamykam");        
                        aa.dispose();
                    }
                    @Override public void windowGainedFocus(WindowEvent e) {}
                });

                dialog.setVisible(true);    
            }
        });
    }
    public static void zrobOkno(){
        okno=new JFrame("Testy okno");
        okno.setLocationRelativeTo(null);
        okno.setSize(200,200);
        okno.setPreferredSize(new Dimension(200,200));
        okno.setVisible(true);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel=new JPanel();
        panel.setPreferredSize(new Dimension(200,200));
        panel.setLayout(new BorderLayout());
        okno.add(panel);
    }
}

1
2018-04-28 13:48



Prueba esto,

catch(NullPointerException ex){
     Thread t = new Thread(new Runnable(){

                            public void run(){

                                  isOpenDialog = true;

                                  JOptionPane.setMessageDialog(Title,Content);
                                }
                              });

     t.start();

     t.join(); // Join will make the thread wait for t to finish its run method, before
                  executing the below lines

     isOpenDialog = false;

   }

-3
2018-06-09 23:11