JOptionPane.showMessageDialog等到单击确定?

swi*_*ode 5 java swing jtable keylistener joptionpane

这可能是一个非常简单的事情,我忽略了,但我似乎无法弄明白.

我有以下更新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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,我不希望isOpenDialog在按下消息对话框上的OK按钮之前将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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否JOptionPane.showMessageDialog()有某种机制阻止执行下一行,直到按下确定按钮?谢谢.

Hov*_*els 10

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

更重要的是,您不应该将KeyListener用于此类事情.如果您希望让JTextField侦听按Enter键,请向其添加ActionListener.


nIc*_*cOw 8

轻松满足您的需求是使用showConfirmDialog(...),结果showMessageDialog(),这可以让您从用户那里获取输入,然后继续进行.请看一下这个示例程序,以便澄清:-)

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);
                }
            }           
        });
    }
}
Run Code Online (Sandbox Code Playgroud)