मेरे पास इसमें class LevenbergForm extends JFrame और एक फंक्शन calculate() है।

सामान्यतया, उस फ़ंक्शन में एक for लूप होता है और प्रत्येक पुनरावृत्ति पर मुझे new JFrame बनाने की आवश्यकता होती है, इसे दिखाएं और बटन दबाए जाने तक प्रतीक्षा करें।

जो समस्या मुझे मिली है, JFrame वह घटक नहीं है। यह सब सफेद है अंदर। और केवल तभी खींचता है जब fucntion calculate() खत्म हो जाता है।

JFrame कैसे बनाएं जबकि मैं अभी भी उस for लूप में हूं?

और button दबाए जाने तक इसे कैसे रोकें? (वैकल्पिक)

void calculate(boolean stepByStep) {
    for (int i = 0; i < n; ++i) {
        //...
        graph = new JFrame();
        graph.setContentPane(chartPanel);
        graph.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        graph.pack();
        graph.setVisible(true);
        graph.setLocationRelativeTo(null);
        //Draw JFrame and stop for loop until button pressed          
        //...   
    }
}
2
ZerGuy 15 नवम्बर 2015, 22:21

2 जवाब

सबसे बढ़िया उत्तर

एक JFrame का उपयोग न करें जो निर्माण और दिखाने पर गैर-अवरुद्ध है। इसके बजाय एक जोडलपैन जैसे एक मोडल डायलॉग का उपयोग करें जो करता है जब तक इसे निपटाया नहीं जाता है तब तक वर्तमान थ्रेड के प्रवाह को अवरुद्ध करें।

कहा कि, तुम्हारा एक असुविधाजनक और संभावित कष्टप्रद कार्यक्रम डिजाइन है। इसके बजाय केवल एक प्रदर्शित टाइमर के राज्य को बदलने के लिए एक स्विंग टाइमर का उपयोग क्यों न करें?

7
Hovercraft Full Of Eels 15 नवम्बर 2015, 19:31

आप EDT के अलावा किसी थ्रेड पर गणना पर विचार कर सकते हैं। आप कोड (अप्रयुक्त) का उपयोग कुछ इस तरह कर सकते हैं

public static void main(String[] args) {
    calculate();
}
public static void calculate() {
    for ( int i=0; i<n; i++ ) {
        // calculations go here... not on EDT!!
        SwingUtilities.invokeLater(()->{
            // create and show JFrame
        });
    }
}

या शायद बेहतर:

public static void main(String[] args) {
    SwingUtilities.invokeLater(()->{
        // create and show JFrame
    });
    calculate();
}
public static void calculate() {
    for ( int i=0; i<n; i++ ) {
        // calculations go here... not on EDT!!
        SwingUtilities.invokeLater(()->{
            // update JFrame
        });
    }
}

यह समाधान उपयोगकर्ता इनपुट के लिए ब्लॉक नहीं करेगा, लेकिन गणना विधि पूरी होने से पहले यह JFrame दिखाएगा। यदि आप बटन प्रेस द्वारा गणनाओं को नियंत्रित करने की इच्छा रखते हैं तो मेरा सुझाव है कि आप इनवर्ट कंट्रोल करें: बटन को दबाएं एक घटना है जो गणनाओं में एक चरण करती है।

0
Jason 1 पद 2018, 17:45