2010-01-01 8 views
5

मेरे पास मेरे JToolBar में बटन का एक गुच्छा है, और मैंने उनमें से कुछ को मेरे आवेदन की स्थिति के आधार पर अक्षम या सक्षम करने के लिए सेट किया है। मुझे लगता है कि जब मैं एक बार में कई बटन अपडेट कर रहा हूं कि वे एक ही समय में सभी को पुनर्निर्मित नहीं कर रहे हैं। मैं यह सुनिश्चित करना चाहता हूं कि जब मैं अक्षम/सक्षम होने के लिए कई बटन सेट करता हूं, तो वे सभी एक ही समय में स्थिति बदलते हैं।क्या मैं कुछ स्विंग घटक अपडेट बैच कर सकता हूं ताकि सभी एक बार में पश्चात हो जाएं?

नीचे एक छोटा परीक्षण है जो समस्या का प्रदर्शन करता है। (इसे बटन आइकन के रूप में उपयोग करने के लिए वर्तमान निर्देशिका में फ़ाइल a.png की आवश्यकता है।) जब आप इसे चलाते हैं, तो 10 बटन वाला टूलबार दिखाया जाता है। टर्मिनल पर एंटर दबाकर सभी बटनों की अक्षम स्थिति को टॉगल कर दिया जाएगा। कम से कम मेरी मशीन पर, हर बार जब मैं ऐसा करता हूं तो बटन एक यादृच्छिक क्रम में पुन: चित्रित होते हैं, और सभी एक साथ नहीं।

ऐसा लगता है कि डबल बफरिंग समस्या को हल कर सकती है, हालांकि पहली चीज मैंने कोशिश की (JToolBar पर डबल बफरिंग सेट करना) कुछ भी प्रभावित नहीं कर रहा था।

धन्यवाद,

कैमरून मुझे XP पर JDK6 प्रयोग करने के लिए

import java.awt.*; 
import javax.swing.*; 
import java.io.*; 
import java.util.*; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     final JButton[] bs = new JButton[10]; 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JFrame f = new JFrame("test"); 
       JToolBar t = new JToolBar(); 
       f.getContentPane().add(t); 
       for (int i = 0; i < bs.length; i++) { 
        bs[i] = new JButton(new ImageIcon("a.png")); 
        t.add(bs[i]); 
       } 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
     BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); 
     for (;;) { 
      r.readLine(); 
      EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        for (JButton b : bs) { 
         b.setEnabled(!b.isEnabled()); 
        } 
       } 
      }); 
     } 
    } 
} 

उत्तर

2

जब तक एक सक्षम थ्रेड रन में सक्षम राज्य परिवर्तन होता है, तब तक ऐसा होता है कि अमान्य स्थिति में कुछ भी नहीं जा सकता है। तो मुझे लगता है कि यह सिर्फ एक पेंटिंग समस्या है? यह सिर्फ बुरा लगता है?

व्यवहार को बदलने का एक संभावित तरीका कंटेनर (उदाहरण के लिए टूलबार) के लिए एक पुनर्विचार कॉल जोड़ना है ताकि प्रत्येक क्षेत्र को अलग-अलग बटन को अलग करने के बजाय एक बार फिर से पुनर्निर्मित किया जा सके।

1

वर्क्स ठीक।

मुझे आपके कोड में कोई समस्या नहीं दिख रही है। मैंने बिना किसी समस्या के एक बार में अधिक घटकों को सक्षम/अक्षम कर दिया है।

समस्या है क्योंकि आप टर्मिनल से इनपुट स्वीकार कर रहे हैं? अपने फ्रेम में एक अलग बटन जोड़ने का प्रयास करें, इस पर क्लिक करने से बटन की स्थिति बदल जाएगी।

0

@camickr मैं विंडोज 7 पर जेडीके 6 पर हूं। मैंने EventQueue.invokeLater() के साथ हुए परिवर्तनों को लात मार दिया क्योंकि मेरे आवेदन में, टूलबार बटन को राज्य को अपडेट करने की आवश्यकता के कारण क्या होता है, इसलिए मैं EventQueue का उपयोग करता हूं .invokeLater() वहाँ। मैंने ईडीटी से सब कुछ करने की कोशिश की (यानी, बटनों में से एक पर एक्शनलिस्टनर से setEnabled() कॉल कर रहा है) लेकिन मुझे अभी भी एक ही अजीब पुनर्भुगतान था।

@iny दाएं, यह बस खराब दिखता है। मैंने वास्तव में ऐसा सोचा था कि क्योंकि सभी राज्य परिवर्तन एक EventQueue के भीतर होते हैं, यह सुनिश्चित करने के बाद कि सभी पेंटिंग एक बार खत्म हो जाएंगी, लेकिन मुझे नहीं लगता है। JToolBar पर repaint() को कॉल करने के आपके सुझाव ने बटन के लिए सभी पेंटिंग को सहारा दिया, धन्यवाद! (एक बार मेरा अपंजीकृत खाता (जिसे मैं वापस नहीं देख सकता) और मेरा हाल ही में पंजीकृत खाता विलय कर दिया गया है, मैं आपका जवाब स्वीकार करूंगा।)

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

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