2011-07-24 9 views
6

मैं चाहता हूं कि जीयूआई किसी ऑब्जेक्ट को तुरंत चालू करने से पहले "गो" से "वर्किंग ..." में बटन के शीर्षक को बदल दे और वास्तव में काम करे। समाप्त होने पर, मैं बटन के शीर्षक को "जाओ" पर वापस जाने के लिए चाहता हूं।ऑपरेशन प्राथमिकता। (GUI अपडेट होने से पहले एक ऑब्जेक्ट तत्काल हो जाता है और चलता है?)

कोड यह रहा:

private class convert implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton)e.getSource(); 

     button.setText("Working..."); 
     button.setEnabled(false); 

     anObject name = new AnObject(); 
     boolean result = name.methodName(chooser.getSelectedFile(),encoding); 

     // A bunch of stuff was here but irrelevant to the question, 
     // so it was removed to save room. 

     button.setEnabled(true); 
     button.setText("Go"); 
    } 

क्या वास्तव में व्यवहार में होता है नाम instantiated है, methodName कहा जाता हो जाता है, और फिर बटन स्क्रीन पर अपडेट किया जाता है, तथ्य यह है कि मुझे बताया गया है के बावजूद बटन शीर्षक पहले बदलने के लिए वीएम।

मेरे काम कर रहे सिद्धांत दिया मैं इस कार्यक्रम पिरोया नहीं किया है, है, यह परिचालन प्राथमिकता, या JVM के आंतरिक सूत्रण, या कुछ और के साथ क्या करना कुछ है ...

कोई सुझाव?

+0

एक अन्य संभावित समाधान करता है, तो अपने "सामान irrelevent का गुच्छा ..." अन्य विंडो प्रदर्शित शामिल है और आप एक JFrame का उपयोग कर रहे, एक मॉडल JDialog बजाय का उपयोग करें। –

+1

कृपया मेरे द्वारा पोस्ट किए गए स्विंगवर्कर और सार तत्व समाधान को भी देखें। –

उत्तर

11

मुझे पता है कि आप पहले से ही एक समाधान स्वीकार कर लिया है, लेकिन जब से तुम "स्थिर जीयूआई" सिंड्रोम में चल रहे हैं, तो आप निश्चित रूप से एक सूत्रण समस्या होती है और invokeLater आपकी समस्या का समाधान नहीं होगा। जैसा कि ऊपर वर्णित किया गया है, आपको इसे हल करने के लिए एक स्विंगवर्कर या कुछ पृष्ठभूमि धागे की आवश्यकता है। साथ ही, मुझे लगता है कि यह एक्शनलिस्टर की बजाय सार तत्व के उपयोग के लिए एक अच्छा मामला है। उदाहरण के लिए:

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

@SuppressWarnings("serial") 
public class Convert extends AbstractAction { 
    private static final long SLEEP_TIME = 3000; // 3 seconds 
    private String enabledText; 
    private String disabledText; 

    public Convert(String enabledText, String disabledText) { 
     super(enabledText); 
     this.enabledText = enabledText; 
     this.disabledText = disabledText; 
    } 

    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 
     if (!(source instanceof JButton)) { 
     return; 
     } 
     final JButton button = (JButton) source; 
     setButtonEnabled(button, false); 
     new SwingWorker<Void, Void>() { 
     @Override 
     protected Void doInBackground() throws Exception { 
      // TODO: long-running code goes here. 
      // Emulated by Thread.sleep(...) 
      Thread.sleep(SLEEP_TIME); 
      return null; 
     } 

     @Override 
     protected void done() { 
      setButtonEnabled(button, true); 
     } 
     }.execute(); 
    } 

    public void setButtonEnabled(JButton button, boolean enabled) { 
     if (enabled) { 
     button.setText(enabledText); 
     button.setEnabled(true); 
     } else { 
     button.setText(disabledText); 
     button.setEnabled(false); 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Convert"); 
     frame.getContentPane().add(new ConvertGui()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class ConvertGui extends JPanel { 
    public ConvertGui() { 
     add(new JButton(new Convert("GO", "Working..."))); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 200); 
    } 
} 
+0

+1, हां हां हां! मुझे समझ में नहीं आता क्यों ओपी सोचता है कि स्वीकार्य उत्तर सही है! यह! – Moonbeam

+0

यदि आवेदक को प्रेषण धागे से बुलाया जाता है - उदाहरण के लिए, जेबटन के एक्शनलिस्टर से - doRun.run() तब भी स्थगित हो जाएगा जब तक सभी लंबित घटनाओं को संसाधित नहीं किया जाता है। ध्यान दें कि अगर doRun।रन() एक बेजोड़ अपवाद फेंकता है कि घटना प्रेषण धागा खुल जाएगा (वर्तमान धागा नहीं)। – user802421

+0

मैंने जवाब स्वीकार कर लिया क्योंकि, जब मैंने समाधान लागू किया, तो यह काम किया। उस ने कहा, यदि इसके साथ कोई समस्या है, तो यह जानना अच्छा है; टिप्पणियों में extraneon पोस्ट के रूप में। –

7

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

+0

स्पष्टीकरण के लिए धन्यवाद। यह ऊपर सुझाए गए कोड पर एक अच्छा ऐड-ऑन है, और बताता है कि इसकी आवश्यकता क्यों है। :) –

+0

+1, सही दृष्टिकोण। – Moonbeam

5

SwingUtilities.invokeLater() आज़माएं।

private class convert implements ActionListener { 
public void actionPerformed(ActionEvent e) { 
    final JButton button = (JButton)e.getSource(); 

    button.setText("Working..."); 
    button.setEnabled(false); 

    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      anObject name = new AnObject(); 
      boolean result = name.methodName(chooser.getSelectedFile(),encoding); 

      // A bunch of stuff was here but irrelevant to the question, 
      // so it was removed to save room. 

      button.setEnabled(true); 
      button.setText("Convert"); 
     } 
    }); 
} 
+6

कृपया ध्यान दें कि यह ईडीटी में चलता है - यदि विधि नाम आपके ऐप को फ्रीज करने में लंबा समय लगेगा। यदि आपके पास लंबी दौड़ वाली नौकरी है, तो एक स्विंगवर्कर का उपयोग करें, और पूर्ण() विधि में शीर्षक पट्टी को अपडेट करें। Extraneon के लिए – extraneon

+0

+1। – user802421

+0

जिसने इसे हल किया, धन्यवाद! जावा के लिए बिल्कुल नया, इसलिए मैं अभी भी इस तरह के कुछ quirks सीख रहा हूँ। –

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