2011-10-16 7 views
5

आप ऊपर मेरे विषय से देखा है में एक और JOptionPane के उद्भव पर एक JOptionPane खारिज कर सकते हैं कैसे,
मैं चाहूँगा पता है कि कैसे मैं एक JOptionPane जो एक और JOptionPane की वजह से और क्योंकि उपयोगकर्ता अप्रासंगिक हो गया खारिज कर सकते हैं , किसी कारण से, ओके बटन पर क्लिक करके पहले व्यक्ति को खारिज नहीं किया (उदाहरण के लिए)।मैं जीयूआई

मैं अन्य साइट समान प्रश्न में कुछ बर्तन को देखा है, और लोगों को बस करने के लिए सुझाव दिया:

JOptionPane.getRootFrame().dispose(); 

लेकिन मैं प्रत्येक JOptionPane मेरे पास है और केवल कि खारिज करने के लिए सक्षम होने के लिए के लिए एक संदर्भ कैसे स्टोर कर सकते हैं एक चाहता था
धन्यवाद

संपादित:
कोड उदाहरण:

package Gui; 

import javax.swing.JOptionPane; 
import java.awt.*; 

/** 
* 
* @author 
*/ 
public class JpanelMainView extends javax.swing.JPanel { 

    /** Creates new form JpanelMainView */ 
    public JpanelMainView() { 
     initComponents(); 
    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 

     jButton1.setText("jButton1"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
     this.setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(149, 149, 149) 
       .addComponent(jButton1) 
       .addContainerGap(178, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(77, 77, 77) 
       .addComponent(jButton1) 
       .addContainerGap(200, Short.MAX_VALUE)) 
     ); 
    }// </editor-fold>       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)           
    {            
     JOptionPane.showMessageDialog(this, "Board was sent for validation check\n Please wait...","Board Sent",JOptionPane.INFORMATION_MESSAGE); 

     //Please note that this OptionPane is coming in my real program always after the first JoptionPane 
     //I want that if I've reached the line in the code that need to show this second JoptionPane, I will first close the first JoptionPane 
     //Else you will dismiss the last JoptionPane and then the first one and I don't want to give the user two JoptionPane to close, it's annoying. 
     JOptionPane.showMessageDialog(this, "Set your move now please","Game started",JOptionPane.INFORMATION_MESSAGE); 
    }           

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    // End of variables declaration     

} 
+1

एक JOptionPane आमतौर पर मोडल है (वहाँ निश्चित रूप से अपवाद हैं), तो मैं आश्चर्य है कि कैसे उपयोगकर्ता भी एक दूसरे JOptionPane ऊपर लाने के लिए जब पहले एक दिख रहा है कर रहा था? क्या आप एक छोटे से संकलित और चलने योग्य प्रोग्राम को बना सकते हैं और पोस्ट कर सकते हैं जो आपकी समस्या का प्रदर्शन करता है और हम एक [एसएससीई] (http://sscce.org) का परीक्षण, संशोधन और संभवतः सही कर सकते हैं? –

+0

ठीक है मैंने वास्तव में सरल कामकाजी उदाहरण उत्पन्न किया है जहां मुझे इसे अपलोड करना चाहिए? – JavaSa

+1

@JavaSa: अपनी पोस्ट संपादित करें और इसे शामिल करें। –

उत्तर

7

मैं टी की सिफारिश करेंगे करेंगे टोपी आप

  • अपने JOptionPane के साथ एक JDialog बनाने (JOptionPane API आपको बताएंगे कि कैसे),
  • तो के लिए एक SwingWorker का उपयोग जो कुछ भी पृष्ठभूमि कार्य आपको लगता है कि मुख्य घुमाओ धागे की बंद किया जाना चाहिए करना चाहते हैं, ईडीटी,
  • फिर स्विंगवर्कर की done() विधि में जिसे पृष्ठभूमि कार्य पूरा होने पर बुलाया जाता है, JDialog का निपटान करें।
  • फिर अगला जॉयप्पेन तुरंत कॉल किया जाएगा।

उदाहरण के लिए निम्नलिखित कोड एक 3 सेकंड नींद के लिए थ्रेड.sleep (3000) का उपयोग करता है जो पृष्ठभूमि कार्य की नकल करने के लिए 3 सेकंड लेता है। यह तो पहले संवाद बंद करें और दिखाएगा दूसरा:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     JOptionPane messagePane = new JOptionPane(
      "Board was sent for validation check\n Please wait...", 
      JOptionPane.INFORMATION_MESSAGE); 
     final JDialog dialog = messagePane.createDialog(this, "Board Sent"); 

     new SwingWorker<Void, Void>() { 

     @Override 
     protected Void doInBackground() throws Exception { 
      // do your background processing here 
      // for instance validate your board here 

      // mimics a background process that takes 3 seconds 
      // you would of course delete this in your actual progam 
      Thread.sleep(3000); 

      return null; 
     } 

     // this is called when background thread above has completed. 
     protected void done() { 
      dialog.dispose(); 
     }; 
     }.execute(); 

     dialog.setVisible(true); 

     JOptionPane.showMessageDialog(this, "Set your move now please", 
      "Game started", JOptionPane.INFORMATION_MESSAGE); 
    } 
+0

मुझे लगता है कि मुझे स्विंग कार्यकर्ता की आवश्यकता नहीं है क्योंकि बोर्ड को सत्यापित करने के बाद यह मेरा पृष्ठभूमि कार्य मेरे सर्वर में आयोजित किया जा रहा है क्लाइंट गुई के लिए ठीक है एक और गेम स्वचालित रूप से – JavaSa

+0

शुरू होता है मुझे यकीन नहीं है कि आपको स्विंगवर्कर या किसी प्रकार के पृष्ठभूमि थ्रेड की आवश्यकता नहीं होगी। बोर्ड को प्रमाणित करने के लिए आपका जीयूआई कोड सर्वर को कैसे बताता है? क्या यह अवरुद्ध तरीके से ऐसा करता है या यह एक गैर-अवरुद्ध तरीके से है? जीयूआई सर्वर की प्रतिक्रिया के लिए कैसे इंतजार करता है? यह कैसे सूचित किया जाता है? ये सभी चीजें आपके स्विंग इवेंट थ्रेड को जोड़ सकती हैं। लेकिन, ... यह आपका आवेदन है, इसलिए जब आप फिट देखते हैं तो ऐसा करें। –

+0

ठीक है, मैं चीजों को और स्पष्ट करने की कोशिश कर रहा हूं, जब मेरा गुई पहले मेरे सर्वर से कनेक्ट हो रहा है, तो क्लाइंट में नया सुनना थ्रेड (रननेबल कार्यान्वयन) खोलता है जो डेटा इनपुटपुट में आने वाले कमांड के लिए इंतजार कर रहा है, इसे पढ़ने के लिए सरल कॉलिंग द्वारा m_InputStream पर फ़ंक्शन सदस्य। गुई सर्वर को एक स्विंग बटन "सत्यापन बोर्ड" पर क्लिक करने के बाद बोर्ड को एक विशेष बोर्ड बिल्डिंग स्क्रीन पर सत्यापित करने के लिए बताता है क्योंकि इसे प्रतिद्वंद्वी के लिए अपना बोर्ड बनाने के लिए तालिका के दूसरे खिलाड़ी की आवश्यकता होती है और केवल तभी – JavaSa

4

सरल जवाब है, यह संभव नहीं है, क्योंकि केवल एक JOptionPane वर्तमान समय में मौजूद कर सकते हैं, अगर आप अपने मुद्दे को हल करना चाहते हैं, तो आप करने के लिए है JDialog#ModalityType(Aplications???) या JWindow बनाने फिर तुम शो करने में सक्षम JOptionPane

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 
    private JFrame frame1 = new JFrame(); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(frame, 
         "Are You Sure to Close this Application?", 
         "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == 0) { 
        System.exit(1); 
       } 
      } 
     }; 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 

     frame1.addWindowListener(exitListener); 
     frame1.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame1.setPreferredSize(new Dimension(400, 300)); 
     frame1.setLocation(500, 100); 
     frame1.pack(); 
     frame1.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      JOptionPane.showMessageDialog(null, "Whatever", "Whatever", 
        JOptionPane.ERROR_MESSAGE); 
      int confirm1 = JOptionPane.showOptionDialog(frame1, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == 0) { 
       //System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
      } 
     }); 
    } 
} 
+0

ठीक है धन्यवाद, लेकिन पोस्ट के स्वीकृत उत्तर में कुछ हेरफेर का उपयोग करने के बारे में क्या है http://stackoverflow.com/questions/4542924/getting-hold-of-a-reference-to-the-object-created-by-joptionpane -स्टैटिक-तरीकों, क्या यह मेरी समस्या का समाधान करेगा? – JavaSa

+0

मुझे लगता है कि केवल एक जोप्शनपेन मौजूद हो सकता है कि पोस्ट – JavaSa

+1

@JavaSa '1) की मदद नहीं कर सकता है मूल रूप से जॉयप्पेन को छिपाना संभव है, '2)' कोई भी गारंटी नहीं देता कि कौन सा कोड ब्लॉक चालू या पिछला हो गया जॉक्शनपेन से पिछला हो जाएगा, '3) 'यह घटक ब्लोकिंग कोड निष्पादन (सेमफोर के रूप में काम करने के लिए) है, उपयोगकर्ता_इनपुट ब्लॉक करें,' 4)' अंतिम संपत्ति कॉल करना है (मैन्युअल रूप से जोड़ा गया जुबटन (कस्टम) के साथ कस्टम जॉप्शनपेन) myButton.doClick() ;, तो जॉप्शनपेन दूर चला गया '5) 'मुझे लगता है कि कुछ भी हल नहीं किया गया है (लिंक जो आपने पोस्ट किया है) :-) – mKorbel

3

माफ करना, मैं आपके सवाल का अच्छी तरह से समझ में नहीं आता, क्या मतलब है आपको लगता है कि आप एक दूसरे से एक JOptionPane बंद करना चाहते हैं?

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class GUIProgram extends JFrame implements ActionListener 
{ 
    private JButton btn1, btn2, btn3; 
    private static final String BUTTON1_COMMAND = "Press it!"; 
    private static final String BUTTON2_COMMAND = "show new JOptionPane!"; 
    private static final String BUTTON3_COMMAND = "close old JOptionPane!"; 
    private JOptionPane pane1, pane2; 

    public GUIProgram() 
    { 
     super("The title"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     btn1 = new JButton(BUTTON1_COMMAND); 
     btn1.addActionListener(this); 
     btn1.setActionCommand(BUTTON1_COMMAND); 

     btn2 = new JButton(BUTTON2_COMMAND); 
     btn2.addActionListener(this); 
     btn2.setActionCommand(BUTTON2_COMMAND); 

     btn3 = new JButton(BUTTON3_COMMAND); 
     btn3.addActionListener(this); 
     btn3.setActionCommand(BUTTON3_COMMAND); 

     pane1 = new JOptionPane(); 
     pane2 = new JOptionPane(); 

     getContentPane().add(btn1); 
     setSize(200, 100); 
     setVisible(true); 
    } 

    public static void main(String args[]) 
    { 
     new GUIProgram(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getActionCommand().equals(BUTTON1_COMMAND)) 
     { 
      JPanel panel = new JPanel(); 
      panel.add(btn2); 
      pane1.showOptionDialog(null, panel, "JOptionPane #1", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{}, null); 
     } 

     else if(e.getActionCommand().equals(BUTTON2_COMMAND)) 
     { 
      JPanel panel = new JPanel(); 
      panel.add(btn3); 
      pane2.showOptionDialog(null, panel, "JOptionPane #2", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{}, null); 
     } 

     else if(e.getActionCommand().equals(BUTTON3_COMMAND)) 
     { 
      pane1.getRootFrame().dispose(); 
     } 
    } 
} 
+0

नहीं, मेरा मतलब था कि यदि उपयोगकर्ता एक जोप्शनपेन पर ठीक क्लिक करने के लिए पर्याप्त तेज़ नहीं है तो वह पृष्ठभूमि पर रहेगा, कुछ समय बाद एक और विकल्प प्राप्त होगा पेन और फिर उसे दो जोप्शनपेन्स बंद करने की आवश्यकता होगी, इसलिए मैं पिछले जोप्शनपेन को रद्द करने में सक्षम होना चाहता हूं अगर वह दूसरा जोप्शनपेन पहले से आया (और उपयोगकर्ता ने पहले को खारिज नहीं किया) – JavaSa

संबंधित मुद्दे