2011-11-26 30 views
5

क्या कोई मुझे बता सकता है कि मैंने JCheckBox के लिए चयन क्यों खो दिया है (setSelected() द्वारा) पर जब मैंने JOptionPane को ItemListener में रखा था? क्या यह एक बग है?जेसीकबॉक्स पर सेट का चयन क्यों प्रभाव खो देता है?

यह उत्सुक है कि अगर इस प्रक्रिया में invokeLater(), setSelected() के साथ देरी हो रही है तो मुझे ठीक से काम करता है।

enter image description hereenter image description here

SSCCE

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

public class ComponentEventDemo extends JPanel 
     implements ComponentListener, ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame; 
    private JTextArea display; 
    private String newline = "\n"; 
    private JTextField field1; 

    public ComponentEventDemo() { 
     super(new BorderLayout()); 
     display = new JTextArea(10, 25); 
     display.setEditable(false); 
     JPanel panel = new JPanel(new GridLayout(0, 2)); 
     field1 = new JTextField(); 
     field1.setDisabledTextColor(Color.red); 
     JCheckBox checkbox = new JCheckBox("Label visible", true); 
     checkbox.addItemListener(this); 
     panel.add(checkbox); 
     panel.add(field1); 
     panel.addComponentListener(this); 
     JScrollPane scrollPane = new JScrollPane(display); 
     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!"); 
     if (evt.getStateChange() == ItemEvent.SELECTED) { 
      //javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      //public void run() { 
      int returnVal = JOptionPane.showConfirmDialog(display, 
        "Bla Bla Bla Text"); 
      if (returnVal == JOptionPane.OK_OPTION) { 
       field1.setText("SELECTED - OK btn"); 
      } else if (returnVal == JOptionPane.NO_OPTION) { 
       field1.setText("SELECTED - NO btn"); 
      } else if (returnVal == JOptionPane.CANCEL_OPTION) { 
       field1.setText("SELECTED - Cancel btn"); 
      } else if (returnVal == JOptionPane.CLOSED_OPTION) { 
       field1.setText("SELECTED - Close btn"); 
      } 
      //} 
      //}); 
     } else if (evt.getStateChange() == ItemEvent.DESELECTED) { 
      field1.setText("DESELECTED"); 
     } 
    } 

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

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

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

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

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

    } 

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

      public void run() { 
       ComponentEventDemo ced = new ComponentEventDemo(); 
      } 
     }); 
    } 
} 
+1

1+ प्रश्न। मैंने इसे पहले देखा है और आपके पास इसे हल कर लिया है - ईडीटी पर जॉप्शनपेन के प्रदर्शन को क्यूइंग करके, लेकिन मैं इसे समझा नहीं सकता क्योंकि मेरे पास अभी तक स्रोत कोड के माध्यम से स्लॉग करने के लिए समय या ऊर्जा नहीं है। –

+0

@ होवरक्राफ्ट फुल ऑफ़ ईल्स मैं डीबग करता हूं कि जावा एपीआई विधियों के अंदर, मैं इस प्रश्न को यहां पोस्ट करने से पहले, सब कुछ सही तरीके से दिखता है, दोनों मामलों में इस विधि के अंदर नोटिफ़ायर किया जाता है, फिर भी मुझे अंतर betweens (जावा विधि के अंदर कदम) नहीं मिल रहा है जॉपपेन के साथ सादा जेकेकबॉक्स और जेसीकबॉक्स, आपकी सुविधा के लिए धन्यवाद – mKorbel

उत्तर

4

यह Oracle Bug ID:6924233 द्वारा स्वीकृत एक ज्ञात बग है JOptionPane स्पष्ट रूप से चेक बॉक्स मूल्य = झूठी के साथ उत्पन्न होने वाली एक और घटना का कारण बनता है।

अनुशंसित फ़िक्स का उपयोग करके JOptionPane को तुरंत चालू करना है।

Submitted On 09-MAR-2010 

The change is in the BasicButtonListener - Method focusLost() 

In 1.6.0_18 it is 

     ... 
     ButtonModel model = b.getModel(); 
     model.setPressed(false); 
     model.setArmed(false); 

in 1.6.0_10 it was 

     ... 
     ButtonModel model = b.getModel(); 
     model.setArmed(false); 
     model.setPressed(false); 

(The order of the statements changed) 

And a setPressed(false) with armed==true leads on an ToggleButton like 
the JCheckBox to a change of the selection (see ToggleButtonModel) 
2

मैक ओएस एक्स & उबंटू से मुझे कोई अंतर नहीं दिख रहा है: DESELECTED राज्य से शुरू, मैं चेकबॉक्स क्लिक करें। मैं चेक फलक के तुरंत बाद चेक मार्क दिखाई देता हूं। मुझे Runnable के साथ या उसके बिना एक ही परिणाम मिलता है।

विंडोज़ पर, परिणाम जैसा वर्णन किया गया है, लेकिन मुझे चेक मार्क का एक छोटा झिलमिलाहट दिखाई देता है क्योंकि विकल्प फलक अग्रभूमि में आता है। एमुलेटर में प्रभाव देखना आसान है, जैसे कि VirtualBox, जो चीजों को धीमा कर सकता है। Runnable कतार में सामान्य ऑपरेशन को पुनर्स्थापित करता है।

+0

क्षमा करें, यह वास्तव में एक उत्तर नहीं है, लेकिन यह एक बग के लिए teh खोज को मार्गदर्शन कर सकता है। – trashgod

+0

(हर बार) मैं मैक/लिनक्स पर किसी भी कोड को चलाने की सराहना करता हूं, या इन मूल ओएस +1 के साथ संगत कोड मांग रहा हूं – mKorbel

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

  • कोई संबंधित समस्या नहीं^_^