2011-10-18 14 views
8

मेरे पास एक स्टैंडअलोन जावा एप्लिकेशन है जो डेटाबेस से डेटा प्राप्त करता है और इसे जेटीबल में प्रदर्शित करता है। जब एप्लिकेशन शुरू होता है, तो उपयोगकर्ता को JDialog में उपयोगकर्ता नाम/पासवर्ड के लिए संकेत दिया जाता है। एक बार सही क्रेडेंशियल दर्ज किए जाने के बाद, डेटा युक्त मुख्य जेफ्रेम प्रदर्शित होता है। मुख्य जेएफआरएएम पर मेरे पास एक लॉगआउट बटन है, जब क्लिक किया गया है, तो मुख्य जेएफआरएम बंद करना चाहिए और लॉगिन जेडियलॉग को फिर से चलाएं। सब कुछ ज्यादातर काम कर रहा है सिवाय इसके कि मुझे पता चला है कि लॉगआउट बटन क्लिक होने पर मुख्य जेफ्रेम दूर नहीं जाता है।जावा स्विंग निपटान() बनाम सेट दृश्य (झूठा)

Main.java:

import javax.swing.SwingUtilities; 

public class Main { 

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

MainFrame.java:

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

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class MainFrame extends JFrame implements ActionListener { 
    private JButton button; 
    private MyDialog dialog; 

    public MainFrame() { 
     super("this is the JFrame"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     dialog = new MyDialog(this); 
     button = new JButton("click me to hide this JFrame and display JDialog"); 
     button.addActionListener(this); 
     add(button); 
     pack(); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     setVisible(false); // works when changed to dispose(); 
     dialog.setVisible(true); 
    } 
} 

MyDialog.java:

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

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 


public class MyDialog extends JDialog implements ActionListener { 
    private JFrame parentFrame; 
    private JButton button; 

    public MyDialog(JFrame parentFrame) { 
     super(parentFrame, "this is the JDialog", true); 
     setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     this.parentFrame = parentFrame; 
     button = new JButton("click me to hide JDialog and show JFrame"); 
     button.addActionListener(this); 
     add(button); 
     pack(); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     setVisible(false); 
     parentFrame.setVisible(true); 
    } 
} 
नीचे मेरी कोड का एक छोटा काम कर उदाहरण है

मेनफ्रेम.जेवा यदि मैं setVisible(false) से dispose() कहता हूं तो उस पंक्ति को बदलता है तो जब मैं बटन क्लिक करता हूं तो जेएफआरम दूर हो जाता है। मेरा सवाल है, यह dispose() के साथ क्यों काम करता है और setVisible(false) के साथ नहीं? क्या मेरे कोड को व्यवस्थित करने का कोई बेहतर तरीका है? मैं स्विंग के लिए नया हूं इसलिए अगर मैं एक मूल प्रश्न पूछता हूं तो मैं क्षमा चाहता हूं। धन्यवाद।


संपादित 2011-10-19 10:26 पीडीटी

आपकी मदद के लिए आप सभी को धन्यवाद। मैंने जेडियलॉग को एक शून्य माता-पिता के रूप में बदल दिया और अब सबकुछ काम करता है जैसा मैं चाहता था।

dialog = new MyDialog(this); 

आप माता-पिता फ्रेम कि संवाद पर बैठता है के रूप में ही फ्रेम स्थापित कर रहे हैं:

+0

जल्दी ही, पोस्ट एक [SSCCE] (http: // pscode। org/sscce.html)। –

उत्तर

6

लाइन जहां JDialog आरंभ देखें। आप देखते हैं, एक संवाद स्वयं प्रकट नहीं हो सकता है, इसे मूल फ्रेम के शीर्ष पर बैठना चाहिए।

अपने कोड में

इसलिए, जब आप लिखें:

setVisible(false); // works when changed to dispose(); 
dialog.setVisible(true); 

पहली पंक्ति आप गायब हो जाने की फ्रेम बता में, तो आप संवाद प्रकट करने के लिए है, जो वास्तव संवाद बताता है अपनी मूल फ्रेम पर प्रकट करने के लिए बता । चूंकि मूल फ्रेम समान है, ऐसा लगता है कि यह आपके लिए दृश्यमान रहता है। यदि आप दूसरी पंक्ति को हटाते हैं, तो मुझे यकीन है कि फ्रेम गायब हो जाएगा। लेकिन जब आप फ्रेम को निपटाने के लिए कहते हैं, तो यह पूरी तरह से गायब हो जाता है क्योंकि आपने इसे केवल दृश्यता खोने के लिए नहीं बताया, बल्कि स्मृति से खुद को हटा दिया।

फिर जब आप संवाद को प्रकट करने के लिए कहते हैं तो यह इसके जेएफआरएम (जिसे निपटान किया गया है) की तलाश में है, इसे फिर से शुरू करता है और खुलता है।

आपकी समस्या को हल करने का तरीका जेडियलोग के लिए एक अलग नया जेएफआरएम बनाना है। फिर निपटान का उपयोग न करें और केवल सेट दृश्यमान कमांड का उपयोग करें।

-Asaf

+1

फ्रेम बनाने के लिए यह पर्याप्त हो सकता है कि यह अपने मूल फ्रेम को फिर से खोलता है। तो, 'MyDialog()' में सुपर कॉल करें: 'सुपर (शून्य, "यह जेडियलॉग" है, झूठा); '। यदि मुख्य फ्रेम छिपा हुआ है तो उसे वैसे भी सार्थक इनपुट प्राप्त नहीं होगा, इसलिए संवाद मोडल करने का कोई कारण नहीं है। – millimoose

+0

@Inerdia आप सही हैं, यह भी एक विकल्प है। मैं भूल गया कि बुलियन समानता के लिए है। साथ ही, मैं काफी हद तक निश्चित हूं कि बुलियन मॉडेलिटी को बहिष्कृत कर दिया गया है और मॉडेलटाइप विधि अब पसंदीदा है। – Asaf

+0

कम से कम आधिकारिक तौर पर नहीं, वास्तव में बहिष्कृत नहीं किया गया। यह निर्दिष्ट किया गया है कि कौन सा बूलियन मान किस प्रकार के औपचारिकता के अनुरूप है, इसलिए शायद यह शैली का एक प्रश्न है जिसे आप पसंद करते हैं। – millimoose

0

मैं अपनी शैली में बस सही कोड दूंगा। यह निश्चित रूप से एकल या यहां तक ​​कि सिद्ध सबसे अच्छा समाधान नहीं है।

मुख्य फ्रेम पर सेट दृश्यमान (झूठी) को मुख्य फ्रेम EXIT_ON_CLOSE के लिए तार्किक रूप से निकट संचालन का आह्वान करना चाहिए। यदि संवाद मुख्य फ्रेम का बच्चा है, तो आवेदन निकलता है।

इसलिए मैंने मोडल डायलॉग को दूसरी शीर्ष विंडो बनाई, जिसमें एक (जेएफआरएएम) मूल के रूप में शून्य है। इसलिए आपके पास दो शीर्ष खिड़कियों के साथ एक आवेदन है। और मोडल संवाद हर बार निपटाया जाता है। मैंने मोडल संवाद DO_NOTHING_ON_CLOSE बना दिया है, क्योंकि आप बंद आइकन को कार्य नहीं करना चाहते हैं। इसलिए कार्यवाही में निपटान()। बेहतर मदद के लिए (आप किसी भी समय एक माता पिता है, तो आप getOwner (बजाय एक क्षेत्र के लिए माता-पिता को कॉपी करने की उपयोग कर सकते हैं)।)

public class Main { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       MainFrame mainFrame = new MainFrame(); 
       mainFrame.actionPerformed(null); 
      } 
     }); 
    } 
} 


public class MainFrame extends JFrame implements ActionListener { 
    private JButton button; 

    public MainFrame() { 
     super("this is the JFrame"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     button = new JButton("click me to hide this JFrame and display JDialog"); 
     button.addActionListener(this); 
     add(button); 
     pack(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     MyDialog dialog = new MyDialog(MainFrame.this); 
     dialog.setVisible(true); 
     setVisible(false); 
    } 
} 


public class MyDialog extends JDialog implements ActionListener { 
    private JButton button; 
    private JFrame parentFrame; 

    public MyDialog(JFrame parentFrame) { 
     super((JFrame)null, "this is the JDialog", false); 
     this.parentFrame = parentFrame; 
     setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     button = new JButton("click me to hide JDialog and show JFrame"); 
     button.addActionListener(this); 
     add(button); 
     pack(); 
     setVisible(false); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     parentFrame.setVisible(true); 
     dispose(); 
    } 
} 
+1

मुझे नहीं लगता कि सेट विज़िबल निकट ऑपरेशन का आह्वान करता है। यह सिर्फ फ्रेम/संवाद छुपाता है ... – Bogdan

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