2012-03-24 4 views
5

मैं वर्तमान समय दिखा रहा घड़ी और हर सेकेंड रीफ्रेश करना चाहता हूं। कोड मैं का उपयोग कर रहा है:एक लेबल पर समय प्रदर्शित करने के लिए स्विंगवर्कर और टाइमर का उपयोग करना?

int timeDelay = 1000; 
ActionListener time; 
time = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      timeLabel.setText(DateTimeUtil.getTime()); 
      /*timeLabel is a JLabel to display time, 
      getTime() is samll static methos to return formatted String of current time */ 
     } 
    }; 
SwingWorker timeWorker = new SwingWorker() { 

     @Override 
     protected Object doInBackground() throws Exception { 

      new Timer(timeDelay, time).start(); 
      return null; 
     } 
    }; 
timeWorker.execute(); 

क्या मैं EDT के अलावा अन्य एक और धागा में timeLabel पाठ ताज़ा करने के लिए चाहते हैं।
क्या मैं इसे सही कर रहा हूं? कोई अन्य बेहतर तरीका?
भी जानकारी के लिए, मैं timeLabel एक extendedJPanel जो उपयोगिताओं के कुछ समान प्रकार के शामिल करने के लिए जोड़ दिया है, और एक अन्य MainJFrame में कहा जाता है।

+4

@ जोनास (1+) से उत्कृष्ट सलाह के अलावा, एक चीज जो आप गलत कर रहे हैं, स्विंग कॉल को पृष्ठभूमि थ्रेड के भीतर से बना रही है। स्विंगवर्कर की 'doInBackground()' विधि में कोई स्विंग कॉल नहीं होना चाहिए जिसे पृष्ठभूमि थ्रेड पर नहीं कहा जा सकता है, जिसका अर्थ है कि आपको निश्चित रूप से इस विधि के अंदर स्विंग टाइमर नहीं बनाना चाहिए, न ही स्विंग टाइमर ऑब्जेक्ट पर 'start() 'को कॉल करना चाहिए । इस सलाह के लिए –

+0

+1। धन्यवाद। एक और बात यह है कि, 'इनइनबैकग्राउंड()' में स्विंग कॉल नहीं हो सकते हैं - क्या इसका मतलब है कि मुझे स्विंग घटकों को 'स्विंगवर्कर' के माध्यम से पैनल, बटन इत्यादि जैसे फ्रेम के अंदर शुरू नहीं करना चाहिए? – Asif

+2

बिल्कुल सही। स्विंगवर्कर गैर-स्विंग प्रारंभिकरण और प्रकाशन, प्रक्रिया, और किए गए तरीकों के माध्यम से स्विंग के साथ संचार के लिए है। –

उत्तर

11

आप स्विंगवर्कर के बिना ऐसा कर सकते हैं, क्योंकि स्विंग टाइमर के लिए यही किया गया है।

int timeDelay = 1000; 
ActionListener time; 
time = new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent evt) { 
     timeLabel.setText(DateTimeUtil.getTime()); 
     /* timeLabel is a JLabel to display time, 
      getTime() is samll static methos to return 
      formatted String of current time */ 
    } 
}; 

new Timer(timeDelay, time).start(); 
+0

स्विंग में क्रियाएं टाइमर स्वयं एक अलग धागे में शुरू होती है ?? – Asif

+1

@Asif: एडीटी पर कार्रवाई निष्पादित की जाती है, क्योंकि एएलए जीयूआई संशोधन सबसे अधिक ईडीटी से किए जाते हैं। – Jonas

+0

ठीक है .. स्वीकार किया गया..धन – Asif