2011-12-15 16 views
6

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

addISDialog = new AddISDialog(); 
addISDialog.setVisible(true); 
addISDialog.setLocationRelativeTo(null); 
//somekind of listener... 
//after "Confirm" button in dialog was pressed, get value 
value = addISDialog.ISName; 
+0

मैंने जेडियलोग के अंदर श्रोता को लागू किया और मैं उस संवाद के अंदर बटन सुन सकता हूं, लेकिन मुझे उस बटन को संवाद के बाहर सुनना होगा - मुख्य एप्लिकेशन में, जहां मैंने उस संवाद को –

+1

कहा था, क्या आप 'जेडियलॉग' कक्षा संपादित कर सकते हैं? यदि ऐसा है, तो आप 'एक्शनइवेंट' को किसी अन्य वर्ग में अग्रेषित कर सकते हैं जो 'एक्शनलिस्टर' इंटरफ़ेस लागू करता है और वह वर्ग जो भी आप चाहते हैं वह कर सकता है। – mre

+0

मैंने खुद को AddISDialog बनाया (सार्वजनिक वर्ग AddISDialog जेडियलॉग लागू करता है एक्शनलिस्टर) तो हाँ, मैं इसे संपादित कर सकता हूं। एक्शनवेन्ट को दूसरी कक्षा में अग्रेषित करने का क्या मतलब है? मैं इसे कैसे कर सकता हूं? –

उत्तर

12

संवाद उपयोगकर्ता प्रेस के बाद गायब हो जाते हैं, तो इस बात की पुष्टि:

  • और आप एक मोडल JDialog के रूप में संवाद व्यवहार करना चाहते हैं, तो यह आसान है, के बाद से आप जानते हैं कि जहां में जैसे ही उपयोगकर्ता संवाद से निपटने के लिए आपका प्रोग्राम होगा, कोड डायलॉग पर setVisible(true) पर कॉल करने के बाद यह सही होगा। तो आप डायलॉग पर setVisible(true) पर कॉल करने के तुरंत बाद कोड की लाइनों में अपने राज्य के लिए संवाद ऑब्जेक्ट से पूछताछ करें।
  • यदि आपको एक गैर-मोडल संवाद से निपटने की आवश्यकता है, तो संवाद की विंडो अदृश्य हो जाने पर आपको सूचित करने के लिए संवाद में एक विंडो लिस्टनर जोड़ना होगा।

संवाद खुला रहने के लिए के बाद उपयोगकर्ता प्रेस की पुष्टि है:

  • तो आप शायद एक PropertyChangeListener का उपयोग करना चाहिए, जैसा कि ऊपर सुझाव दिया गया है। या तो डायलॉग ऑब्जेक्ट को सार्वजनिक विधि दें जो बाहरी कक्षाओं को पुष्टिकरण बटन पर एक्शनलिस्टर जोड़ने की क्षमता देता है।

अधिक जानकारी के लिए, कृपया हमें अपने कोड के प्रासंगिक बिट्स, या इससे भी बेहतर, sscce दिखाएं।

उदाहरण JDialog कक्षा के बाहर श्रोताओं को स्वीकार करने की अनुमति देने के लिए, आप इसे दे सकता है एक JTextField और एक JButton:

class MyDialog extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

और एक विधि के बाहर कक्षाएं बटन के लिए एक ActionListener जोड़ने की अनुमति देता है कि:

public void addConfirmListener(ActionListener listener) { 
    confirmBtn.addActionListener(listener); 
} 

फिर बाहरी कक्षा अपने एक्शनलिस्टर को पुष्टिकरण में जोड़ने के लिए 'addConfirmListener (...) विधि को कॉल कर सकती है।

उदाहरण के लिए:

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

import javax.swing.*; 

public class OutsideListener extends JFrame { 
    private JTextField textField = new JTextField(10); 
    private JButton showDialogBtn = new JButton("Show Dialog"); 
    private MyDialog myDialog = new MyDialog(this, "My Dialog"); 

    public OutsideListener(String title) { 
     super(title); 
     textField.setEditable(false); 

     showDialogBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if (!myDialog.isVisible()) { 
       myDialog.setVisible(true); 
      } 
     } 
     }); 

     // !! add a listener to the dialog's button 
     myDialog.addConfirmListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      String text = myDialog.getTextFieldText(); 
      textField.setText(text); 
     } 
     }); 

     JPanel panel = new JPanel(); 
     panel.add(textField); 
     panel.add(showDialogBtn); 

     add(panel); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new OutsideListener("OutsideListener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

class MyDialog extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

    public MyDialog(JFrame frame, String title) { 
     super(frame, title, false); 
     JPanel panel = new JPanel(); 
     panel.add(textfield); 
     panel.add(confirmBtn); 

     add(panel); 
     pack(); 
     setLocationRelativeTo(frame); 
    } 

    public String getTextFieldText() { 
     return textfield.getText(); 
    } 

    public void addConfirmListener(ActionListener listener) { 
     confirmBtn.addActionListener(listener); 
    } 
} 

चेतावनियां हालांकि: मैं JFrame या JDialog उपवर्गीकरण जब तक बिल्कुल जरूरी सलाह नहीं देते। यह सिर्फ अल्पसंख्यक के लिए किया गया था। मैं भी इस समस्या को हल करने के लिए एक मोडल संवाद का उपयोग करना पसंद करता हूं और आवश्यकता होने पर संवाद को फिर से खोलता हूं।

संपादित 2
एक मोडल संवाद के उपयोग का एक उदाहरण:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class OutsideListener2 extends JFrame { 
    private JTextField textField = new JTextField(10); 
    private JButton showDialogBtn = new JButton("Show Dialog"); 
    private MyDialog2 myDialog = new MyDialog2(this, "My Dialog"); 

    public OutsideListener2(String title) { 
     super(title); 
     textField.setEditable(false); 

     showDialogBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if (!myDialog.isVisible()) { 
       myDialog.setVisible(true); 

       textField.setText(myDialog.getTextFieldText()); 
      } 
     } 
     }); 

     JPanel panel = new JPanel(); 
     panel.add(textField); 
     panel.add(showDialogBtn); 

     add(panel); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new OutsideListener2("OutsideListener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

class MyDialog2 extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

    public MyDialog2(JFrame frame, String title) { 
     super(frame, title, true); // !!!!! made into a modal dialog 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Please enter a number between 1 and 100:")); 
     panel.add(textfield); 
     panel.add(confirmBtn); 

     add(panel); 
     pack(); 
     setLocationRelativeTo(frame); 

     ActionListener confirmListener = new ConfirmListener(); 
     confirmBtn.addActionListener(confirmListener); // add listener 
     textfield.addActionListener(confirmListener); 
    } 

    public String getTextFieldText() { 
     return textfield.getText(); 
    } 

    private class ConfirmListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
     String text = textfield.getText(); 
     if (isTextValid(text)) { 
      MyDialog2.this.setVisible(false); 
     } else { 
      // show warning 
      String warning = "Data entered, \"" + text + 
       "\", is invalid. Please enter a number between 1 and 100"; 
      JOptionPane.showMessageDialog(confirmBtn, 
        warning, 
        "Invalid Input", JOptionPane.ERROR_MESSAGE); 
      textfield.setText(""); 
      textfield.requestFocusInWindow(); 
     } 
     } 
    } 

    // true if data is a number between 1 and 100 
    public boolean isTextValid(String text) { 
     try { 
     int number = Integer.parseInt(text); 
     if (number > 0 && number <= 100) { 
      return true; 
     } 
     } catch (NumberFormatException e) { 
     // one of the few times it's OK to ignore an exception 
     } 
     return false; 
    } 

} 
+0

मुझे लगता है कि मुझे आपका विचार मिला है, लेकिन अब एक और जुड़ाव समस्या है: श्रोता को कार्रवाई भेजने से पहले, मुझे चाहिए बटन दबाए जाने पर संवाद में डेटा की पुष्टि करने के लिए। बस जब डेटा मान्य होता है (जब वैध - संवाद बंद हो जाता है, अन्यथा नहीं करता है), आगे के कार्यों के लिए मूल्य को पढ़ना होगा। मैं संवाद वर्ग से श्रोता को किसी प्रकार की अधिसूचना को आग लगा सकता हूं, लेकिन मुझे नहीं पता कि –

+0

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

+0

@PooLaS: ऊपर एक मोडल संवाद समाधान के उदाहरण के लिए संपादन देखें। –

-1
import javax.swing.JOptionPane; 

या आप पहले से ही

import javax.swing.*; 

झूलते रहे हैं आप को कवर किया गया होगा।

सशर्त ट्रिगर JOptionPane के बाद अपने चेतावनी या जो कुछ भी मोडल संदेश भेजने के लिए:।

JOptionPane.showMessageDialog(
      null, 
      "Your warning String: I can't do that John", 
      "Window Title", 
      JOptionPane.ERROR_MESSAGE); 

JOptionPane के लिए अपने विकल्पों की जाँच * संदेश प्रकार का निर्धारण करने के लिए।

+0

यह उत्तर समस्या को हल नहीं करता है OP को हल करने का प्रयास करता है। –

0
//Why is this working so well even without the ActionListener interface, and all I'm 
//getting is minor format errors at the end brackets? Know how to fix it? 



final JButton newButton = new JButton("Send"); 
      newButton.setActionCommand("Send"); 
      textPane.add(newButton); 
      newButton.setEnabled(true); 
      newButton.addActionListener(new ActionListener(); 


        public void actionPerformed(ActionEvent e){ 

        // display/center the jdialog when the button is pressed 
        JDialog digFree = new JDialog(digFree, "Hello", true); 
        digFree.setLocationRelativeTo(newButton); 
        digFree.setFocusable(true); 
        digFree.setVisible(true); 
        digFree.setBounds(20, 20, 100, 120); 
        } 
0

अगर आपके jDialog दिख रहा है तुम क्यों की जांच नहीं करते?

yourJD.setVisible(true); 
while(yourJD.isVisible())try{Thread.sleep(50);}catch(InterruptedException e){} 

यह भी काम करता है।

+1

आपके कोड स्वरूपण में कुछ गड़बड़ हुई। परामर्श [मार्कडाउन सहायता - कोड और प्रीफॉर्मेटेड टेक्स्ट] (http://stackoverflow.com/editing-help#code) और कृपया अपनी पोस्ट संपादित करें। –