5

This might be a very simple thing that I'm overlooking, but I just can't seem to figure it out.

I have the following method that updates a 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;
            }
        }
    }

However, I don't want isOpenDialog boolean to be set to false until the OK button on the message dialog is pressed, because if a user presses enter it will activate a KeyListener event on a textfield and it triggers that entire block of code again if it's set to false.

Part of the KeyListener code is shown below:

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

Does JOptionPane.showMessageDialog() have some sort of mechanism that prevents executing the next line until the OK button is pressed? Thank you.

4

4 に答える 4

11

JOptionPane はモーダル ダイアログを作成するため、ダイアログが処理される (ボタンの 1 つが押されるか、メニューを閉じるボタンが押される) まで、それより後の行は設計上呼び出されません。

さらに重要なことは、この種の目的で KeyListener を使用するべきではありません。Enter キーの押下を JTextField でリッスンする場合は、それに ActionListener を追加します。

于 2012-06-10T00:17:33.687 に答える
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);
                }
            }           
        });
    }
}
于 2012-06-10T04:16:03.487 に答える
1
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);
    }
}
于 2013-04-28T13:48:44.637 に答える
-3

これを試して、

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;

   }
于 2012-06-09T23:11:35.360 に答える