Java JOptionPane.showMessageDialog是否等待单击“确定”?

Java JOptionPane.showMessageDialog是否等待单击“确定”?,java,swing,jtable,keylistener,joptionpane,Java,Swing,Jtable,Keylistener,Joptionpane,这可能是我忽略的一件非常简单的事情,但我似乎无法理解 我有以下更新JTable的方法: class TableModel extends AbstractTableModel { public void updateTable() { try { // update table here ... } catch (NullPointerException npe) {

这可能是我忽略的一件非常简单的事情,但我似乎无法理解

我有以下更新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;
            }
        }
    }
但是,在按下消息对话框上的OK按钮之前,我不希望将
isOpenDialog
boolean设置为false,因为如果用户按下enter键,它将激活文本字段上的
KeyListener
事件,如果设置为
false
,它将再次触发整个代码块

部分KeyListener代码如下所示:

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();
            }
        }
    }
}
JOptionPane.showMessageDialog()
是否有某种机制,在按下OK按钮之前阻止执行下一行?谢谢。

试试这个

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;

   }

JOptionPane创建一个模式对话框,因此在处理该对话框(按下其中一个按钮或关闭菜单按钮)之前,不会调用超出该对话框的行


更重要的是,你不应该使用KeyListener来做这类事情。如果您想让JTextField监听是否按enter键,请向其添加一个ActionListener。

满足您需要的一个简单解决方法是使用showMessageDialog(),这使您可以从用户处获取输入,然后继续进行类似操作。请看一下这个示例程序,以便澄清:-)


Swing操作(例如打开对话框)应该在EventDispatcherThreadAgree with noise中发生:这种代码不属于Swing应用程序,因为它完全忽略了Swing线程规则。甚至我也同意Swing操作必须在Event Dispatcher线程中发生,如main()swing应用程序中的方法在事件调度程序线程中调度GUI的构造并退出。但书中所描述的规则是为了理想世界,有时你需要成为一个叛逆者才能完成工作。你的意识形态是有缺陷的,@KumarVivekMitra。
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);
                }
            }           
        });
    }
}
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);
    }
}