2012-06-09 14 views
5

Dies könnte eine sehr einfache Sache sein, die ich übersehe, aber ich kann es einfach nicht herausfinden.JOptionPane.showMessageDialog warte bis OK geklickt wird?

Ich habe die folgende Methode, die eine JTable aktualisiert:

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

aber ich will nicht isOpenDialog boolean, bis die OK-Taste auf dem Nachrichtendialog auf false gesetzt werden, gedrückt wird, denn wenn ein Benutzer Drücken Sie die Eingabetaste, wird ein KeyListener-Ereignis in einem Textfeld aktiviert und löst den gesamten Codeblock erneut aus, wenn er auf false gesetzt ist.

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

Hat JOptionPane.showMessageDialog() irgendeine Art von Mechanismus, der die nächste Zeile verhindert die Ausführung, bis die OK-Taste gedrückt wird:

Ein Teil des KeyListener Code ist unten dargestellt? Vielen Dank.

Antwort

10

Die JOptionPane schafft einen Dialog modal und so die Linie darüber hinaus durch Design wird nicht aufgerufen, bis der Dialog mit (entweder eine der Tasten gedrückt wurden, behandelt wurden oder die Schließen Sie die Menü-Taste wurde gedrückt).

Wichtiger, Sie sollten keinen KeyListener für diese Art von Sache verwenden. Wenn Sie möchten, dass ein JTextField auf das Drücken der Eingabetaste wartet, fügen Sie ihm einen ActionListener hinzu.

-3

die Sie interessieren,

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

Swing-Operationen (wie einen Dialog zu öffnen) in der EventDispatchThread –

+3

passieren sollte mit Lärm sich einig: Diese Art von Code gehört nicht in einer Swing-Anwendung, da Swing-Übergaberegeln vollständig ignoriert werden. –

+0

Auch ich stimme zu, dass die Swing-Operation im Ereignis-Dispatcher-Thread stattfinden muss, da die main() - Methode in der Swing-Anwendung den Aufbau der GUI im Ereignis-Dispatcher-Thread plant und beendet. Aber Regeln, die in Büchern beschrieben werden, sind für die ideale Welt, und manchmal muss man ein Rebell sein, um die Arbeit zu erledigen. –

7

Eine einfache Lösung, um Ihre Anforderungen zu erfüllen, ist die Verwendung von showConfirmDialog(...), über showMessageDialog(), so können Sie die Eingabe vom Benutzer nehmen und dann ebenfalls vorgehen. haben Sie einen Blick auf dieses Beispiel-Programm, zur Klärung :-)

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