2012-06-09 24 views
5

यह एक बहुत ही साधारण बात हो सकती है जिसे मैं देख रहा हूं, लेकिन मुझे लगता है कि मैं इसे समझ नहीं पा रहा हूं।JOptionPane.showMessageDialog ठीक है जब तक ठीक क्लिक नहीं किया जाता है?

मैं निम्न विधि एक 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; 
      } 
     } 
    } 

हालांकि, मैं नहीं चाहिए isOpenDialog बूलियन संदेश संवाद में ठीक बटन पर जब तक गलत पर सेट होने के लिए दबाया जाता है, क्योंकि एक उपयोगकर्ता अगर प्रेस दर्ज करें यह एक टेक्स्टफील्ड पर 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() तंत्र कि अगली पंक्ति को क्रियान्वित जब तक ठीक बटन दबाया जाता है रोकता है किसी प्रकार का है? धन्यवाद।

उत्तर

10

JOptionPane मॉडल संवाद बनाता है और इसलिए यह परे लाइन डिजाइन द्वारा जब तक संवाद के साथ (या तो बटनों में से एक धक्का दिया या किया गया है निपटा कर दिया गया है कहा जाता है नहीं की जाएगी बंद मेनू बटन दबाया गया है)।

अधिक महत्वपूर्ण, आपको इस तरह की चीज़ के लिए एक KeyListener का उपयोग नहीं करना चाहिए। यदि आप एंटर कुंजी के प्रेस के लिए JTextField सुनना चाहते हैं, तो इसमें एक एक्शनलिस्टर जोड़ें।

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

    } 
+3

स्विंग आपरेशन (जैसे एक संवाद खोलने के रूप में) इस उदाहरण कार्यक्रम पर एक नज़र, स्पष्टीकरण के लिए है EventDispatchThread –

+3

में होना चाहिए शोर के साथ सहमत: कोड इस तरह का नहीं है स्विंग एप्लिकेशन में यह स्विंग थ्रेडिंग नियमों को पूरी तरह से अनदेखा करता है। –

+0

यहां तक ​​कि मैं मानता हूं कि स्विंग ऑपरेशन इवेंट डिस्पैचर थ्रेड में होना चाहिए, स्विंग एप्लिकेशन शेड्यूल में मुख्य() विधि के रूप में ईवेंट डिस्पैचर थ्रेड और क्विट्स में जीयूआई का निर्माण। लेकिन पुस्तकों में वर्णित नियम आदर्श दुनिया के लिए हैं, और कभी-कभी काम करने के लिए किसी को विद्रोही होने की आवश्यकता होती है। –

7

showConfirmDialog(...) का उपयोग पर का उपयोग करने के लिए एक आसान काम है, इससे आप उपयोगकर्ता से इनपुट ले सकते हैं और फिर इसी तरह आगे बढ़ सकते हैं। :-)

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