2012-06-09 12 views
5

To może być bardzo prosta rzecz, którą przeoczyłem, ale po prostu nie mogę tego zrozumieć.JOptionPane.showMessageDialog czekać, aż zostanie kliknięty przycisk OK?

Mam następującą metodę, która aktualizuje 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; 
      } 
     } 
    } 

Jednak nie chcę isOpenDialog logiczna być ustawiona na false, dopóki przycisk OK w oknie komunikatu jest wciśnięty, ponieważ jeśli użytkownik naciśnięcie tego przycisku aktywuje zdarzenie KeyListener na polu tekstowym i ponownie uruchamia cały blok kodu, jeśli jest ustawiony na false.

część kodu KeyListener przedstawiono poniżej:

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

Czy JOptionPane.showMessageDialog() mieć jakiś mechanizm, który uniemożliwia wykonanie następnego wiersza, aż przycisk OK jest wciśnięty? Dziękuję Ci.

Odpowiedz

10

JOptionPane tworzy okno modalne, a więc linia poza nim będzie przez projekt nie można nazwać aż dialogowe zostały omówione (albo jeden z przycisków zostały zepchnięte lub wciśnięto przycisk zamykania menu).

Co ważniejsze, nie powinieneś używać KeyListener do tego typu rzeczy. Jeśli chcesz, aby JTextField nasłuchiwał, naciśnij klawisz Enter, dodaj do niego ActionListener.

-3

Spróbuj tego,

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

operacji Swing (takie jak otwarcie okna dialogowego) powinno nastąpić w EventDispatchThread –

+3

Zgadzam się z hałasem: Ten rodzaj kodu nie należy w aplikacji Swing, ponieważ całkowicie ignoruje zasady Swing threading. –

+0

Nawet ja zgadzam się, że operacja Swing musi się zdarzyć w wątku Dispatchera zdarzeń, ponieważ metoda main() w aplikacji swingowej planuje budowę GUI w wątku Dispachera zdarzeń i kończy działanie. Zasady opisane w książkach dotyczą świata idealnego, a czasami trzeba być buntownikiem, aby wykonać pracę. –

7

Łatwym obejść do swoich potrzeb jest stosowanie showConfirmDialog(...) ponad showMessageDialog() ta pozwala wziąć wejście od użytkownika, a następnie postępować podobnie. Czy rzucić okiem na ten przykład programu, dla wyjaśnienia :-)

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); 
    } 
} 
Powiązane problemy