2011-04-27 17 views
7

मेरे पास एक चेकबॉक्स है कि, जब उपयोगकर्ता इसे चुनता है, तो आगे की जानकारी के साथ एक संवाद उत्पन्न करना चाहिए, और उपयोगकर्ता से प्रतिक्रिया पर, कुछ करें। मेरा कोड मूल रूप से इस तरह दिखता है:जब मैं राज्य परिवर्तन पर एक संवाद दिखाता हूं, तो कैसे ठीक किया जाए, JCheckbox दो बार राज्य बदलता है?

private void onItemStateChanged(java.awt.event.ItemEvent evt) { 
    System.out.println("STATE CHANGED!");//TODO debug code 
    if (evt.getStateChange() == ItemEvent.SELECTED) { 
     int returnVal = JOptionPane.showConfirmDialog(this, "blablatext"); 
     if (returnVal == JOptionPane.OK_OPTION) { 
      this.field1TF.setText(""); 
      this.field1TF.setEditable(false); 
      this.field2TF.setText(""); 
      this.filed2TF.setEditable(false); 
     }else if(returnVal == JOptionPane.NO_OPTION){ 
      this.field1TF.setText(""); 
      this.field1TF.setEditable(false); 
      this.field2TF.setText(""); 
      this.field2TF.setEditable(false); 
     } 
    } else if(evt.getStateChange() == ItemEvent.DESELECTED){ 
     this.field1TF.setEditable(true); 
     this.field2TF.setEditable(true); 
    } 
} 

मेरी समस्या अब है, कि जब मैं उस पर क्लिक करता हूं तो मेरा चेकबॉक्स हमेशा दो बार राज्य बदलता है। इसे किसी भी तरह से जॉप्शनपेन.शो कॉनफर्मडिअलॉग के साथ करना है क्योंकि अगर मैं इसे टिप्पणी करता हूं, तो यह इरादे से काम करता है। क्या मुझे कुछ सरलता से अवगत नहीं है, मुझे यहां परवाह करना चाहिए, या मेरी वांछित प्रतिक्रिया प्राप्त करने के लिए मुझे क्या करना है? (उपयोगकर्ता क्लिक करता है चेकबॉक्स -> एक प्रश्न पूछा है -> चुनता हाँ/नहीं/रद्द करें -> कार्यक्रम के हिसाब से काम करता है)

उत्तर

6
+0

हालांकि यह (चेक बॉक्स की स्थिति के लिए एक वैश्विक चर के साथ) इस तरह काम करता है मैं ItemStateChanged पर काम करने के लिए कोई हैंडलर सोचा था कि मैं वास्तव में क्या जरूरत थी। क्या आप जानते हैं कि यह इसके साथ क्यों काम नहीं करता है? यदि आप मूल समस्या के समाधान के साथ कोई और नहीं आते हैं, तो मैं आपको 'उत्तर स्वीकार कर दूंगा', क्योंकि यह मेरे लिए एक वैध कामकाज है। –

+0

ठीक है http://download.oracle.com/javase/tutorial/uiswing/events/itemlistener.html जिसमें सिमिलियर आउट के साथ एक्स्प्ले शामिल है और मैं एक्शनलिस्टर – mKorbel

+3

के बारे में उदाहरण भेजूंगा मुझे श्रोता लिखने में कोई समस्या नहीं है , मुझे समस्या है कि चेकबॉक्स की स्थिति लगातार दो बार बदलती है, जो कि किसी भी तरह जॉयस्पेन.शोडायलॉग में अपना स्रोत होना चाहिए .. मैं करता हूं। मैं आपकी मदद की सराहना करता हूं, और अभी के लिए मैंने एक्शन लिस्टनर का उपयोग किया था, लेकिन इस पोस्ट का विचार कुछ संकेत प्राप्त करना था कि क्यों संवाद मैं उत्पन्न करता हूं चेकबॉक्स को फिर से अनचेक करने का कारण बनता है –

1

eeerggrrhh को , आपको आइटम लिस्टनर को देखना होगा, और इस डेमो का उपयोग करके ....

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

/** @see http://stackoverflow.com/questions/5806712 */ 
public class ComponentEventDemo extends JPanel 
    implements ActionListener, ComponentListener, ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame; 
    private JTextArea display; 
    private JLabel label; 
    private String newline = "\n"; 
    private JTextField field1TF; 
    private JTextField field2TF; 
    private JCheckBox checkbox; 

    public ComponentEventDemo() { 
     super(new BorderLayout()); 
     display = new JTextArea(); 
     display.setEditable(false); 
     JPanel panel = new JPanel(new GridLayout(0, 4)); 
     field1TF = new JTextField(); 
     field1TF.setDisabledTextColor(Color.red); 
     field2TF = new JTextField(); 
     field2TF.setDisabledTextColor(Color.red); 
     label = new JLabel("This is a label", JLabel.CENTER); 
     label.addComponentListener(this); 
     checkbox = new JCheckBox("Label visible", true); 
     checkbox.addActionListener(this); 
     checkbox.addComponentListener(this); 
     checkbox.addItemListener(this); 
     panel.add(checkbox); 
     panel.add(label); 
     panel.add(field1TF); 
     panel.add(field2TF); 
     panel.addComponentListener(this); 
     JScrollPane scrollPane = new JScrollPane(display); 
     scrollPane.setPreferredSize(new Dimension(650, 200)); 
     frame = new JFrame("ComponentEventDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.add(panel, BorderLayout.SOUTH); 
     frame.addComponentListener(this); 
     frame.setLocation(200, 200); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public void itemStateChanged(ItemEvent evt) { 
     System.out.println("STATE CHANGED!");//TODO debug code 
     if (evt.getStateChange() == ItemEvent.SELECTED) { 
      int returnVal = JOptionPane.showConfirmDialog(frame, "blablatext"); 
      if (returnVal == 0) { 
       field1TF.setText("SELECTED - OK btn"); 
       field1TF.setEditable(false); 
       field2TF.setText("SELECTED - OK btn"); 
       field2TF.setEditable(false); 
      } else if (returnVal == 1) { 
       field1TF.setText("SELECTED - canc btn"); 
       field1TF.setEditable(true); 
       field2TF.setText("SELECTED - canc btn"); 
       field2TF.setEditable(true); 
      } 
     } else if (evt.getStateChange() == ItemEvent.DESELECTED) { 
      field1TF.setEditable(true); 
      field1TF.setText("DESELECTED"); 
      field2TF.setEditable(true); 
      field2TF.setText("DESELECTED"); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     boolean selected = checkbox.isSelected(); 
     System.out.println("Checkbox " 
      + (selected ? "is" : "is not") + " selected."); 
      if (selected) { 
       //some stuff 
      } else { 
       //some reversal stuff 
      } 
    } 

    protected void displayMessage(String message) { 
     display.append(message + newline); 
     display.setCaretPosition(display.getDocument().getLength()); 
    } 

    @Override 
    public void componentHidden(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Hidden"); 
    } 

    @Override 
    public void componentMoved(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Moved"); 
    } 

    @Override 
    public void componentResized(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Resized "); 
    } 

    @Override 
    public void componentShown(ComponentEvent e) { 
     displayMessage(e.getComponent().getClass().getName() + " --- Shown"); 

    } 

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

      @Override 
      public void run() { 
       ComponentEventDemo ced = new ComponentEventDemo(); 
      } 
     }); 
    } 
} 
+0

मैंने आपके उदाहरण को दोबारा सुधारने और अपना अन्य जवाब विलय करने की स्वतंत्रता ली। उत्तर को अद्यतन करना आम तौर पर बेहतर होता है, जब तक कि यह एक महत्वपूर्ण दृष्टिकोण न हो। +1, बीटीडब्ल्यू। – trashgod

+0

@ trashgod सहमत हुए और हटाएं भी – mKorbel

0

कोई आइटम जोड़ें istener और isSelected के लिए जाँच मेरे लिए यह किया:

 checkbox.addItemListener(new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent e) { 
        if(checkbox.isSelected()){ 
         System.out.println(checkbox.getText() + " ++ " + checkbox.isSelected()); 
         //do stuff 
        }else{ 
         System.out.println(checkbox.getText() + " -- " + checkbox.isSelected()); 
         //do other stuff 
        } 

       } 
     });