Удаленная функция Java требует двойного вызова

Я создал java-код (форма Swing GUI JFrame), который вызывает другую функцию класса (которая находится в другом проекте) при нажатии кнопки, но мне нужно дважды щелкнуть кнопку, чтобы успешно вернуть значение из вызываемого функция. Есть ли решение?

вот мой код,

Графический интерфейс

package aarib;

import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import AlKhalil.ui.Aarib;

public class GUI extends javax.swing.JFrame {

    public String Input;
    public String Lexems;
    public Aarib A;

public GUI() {
        initComponents();
        A = new Aarib();
        jTextField1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        jLabel2.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

    }
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:

        if(jTextField1.getText().isEmpty())
        {
            jLabel2.setText("No input");
        }
        else{
            Input = jTextField1.getText().toString();
            A.inputText= Input;
            try { 

                Lexems = A.LexicalAnalysis();
                jLabel2.setText(Lexems);

            } catch (Exception ex) {
                jLabel2.setText("Error");
                Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}  

и удаленная функция

package AlKhalil.ui;
import java.util.*;
import java.util.List;
import AlKhalil.token.*;
import AlKhalil.analyse.*;
import AlKhalil.*;
import AlKhalil.result.*;


public class Aarib {

    public Analyzer analyzer;
    public String myResult="";
    public String inputText="";

    public Aarib() {
        Settings settings = new Settings();
        analyzer = new Analyzer();

    }

    public String LexicalAnalysis() throws Exception {

        Thread t = new Thread() 
        {
            public void run() 
            {
            //some code
                    ...
                    ...
                    ...
            }
        };

       t.start();
       return myResult;
    }
}

Заранее спасибо :)


person user2090737    schedule 20.02.2013    source источник


Ответы (1)


Решение состоит в том, чтобы дождаться результата, полученного в потоке t. С вашим текущим кодом вы запускаете параллельный поток и мгновенно возвращаете атрибут myResult. При втором нажатии кнопки myResult (в большинстве случаев) заполняется потоком и возвращается после запуска другого параллельного потока, выполняющего вычисления.

Я предлагаю рассмотреть какой-нибудь Observer-Pattern для вашей программы. Затем ваш графический интерфейс должен отслеживать поток вычислений и получать уведомления о результате, который затем будет обработан.

Но поскольку мы все не можем видеть код, выполняемый в потоке, и пока вы ждете завершения потока, почему бы просто не использовать поток.

person Markus    schedule 20.02.2013
comment
Спасибо за помощь :) Я добавил это while (t.isAlive()) { } перед return myResult; и это сработало :) - person user2090737; 20.02.2013