依赖注入共享应用程序上下文JavaFX

时间:2016-09-25 23:53:05

标签: java multithreading javafx dependency-injection

我想知道如何共享应用程序上下文。即我有一个主控制器,我初始化和更新我的UI。另一方面,我有一项服务,负责收集数据以放入我的UI。在我的班级myThreadService中,我在第83行有NullPointerException因为未正确注入注入变量applicationContext。我正在使用javax.inject包进行注入。我按照本教程实现了注入:dependency injction

这是我的MainController

package kinoClick;
import threadService.myThreadService;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javax.inject.Inject;
import javax.inject.Named;

@Named("applicationContext")
public class MainController implements Initializable{
    /**
     * Initializes the controller class.
     */

    @Named("threadExecutor")
    @Inject public myThreadService th;

    @FXML
    private volatile TextArea textArea;
    private Button playButton;
    public String recordText;

    @Override // This method is called by the FXMLLoader when initialization is complete
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
        assert playButton != null : "fx:id=\"myButton\" was not injected: check FXML file 'main.fxml'.";
        th = new myThreadService();
        assert textArea != null : "fx:id=\"textArea\" was not injected: check FXML file 'main.xml'";
        // initialize your logic here: all @FXML variables will have been injected
    }

    public void record() throws Exception{
        th.start();
    }

    public void pause() throws Exception{
      th.pause();
    }

    public String updateTextAera(){
        System.out.println("updating text Area");
        textArea.appendText(recordText);
        return recordText;  
    }

    public TextArea getTextAera(){
        return this.textArea;
    }

    public void setText(String text){
        this.recordText = text;
    }
}

和我的MyThreadService

package threadService;

import java.awt.MouseInfo;
import java.util.concurrent.*;
import kinoClick.MainController;
import javax.inject.Inject;
import javax.inject.Named;

@Named("threadExecutor")
public class myThreadService {

    private final int NB_THREADS = 2;
    private final int THREAD_LENGTH = 300;
    public volatile boolean runFlag = false;
    private ScheduledExecutorService ses;
    public volatile String outPut;

    @Inject
    @Named("apllicationContext")
    public MainController applicationContext;

    public String start() throws Exception {
        setRunFlag(true);
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(NB_THREADS);
        this.ses = scheduledExecutorService;
        try{
            ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(new Callable() {
                public Object call() throws Exception {
                    startRecord(THREAD_LENGTH);
                    System.out.println("Executed!");
                    return "Called!";
                }       
            },5,TimeUnit.MILLISECONDS);
        }   
        catch(Exception e){
            System.out.println("Exception while scheduling task "+e);          
        }
        return "error";
    }

public boolean pause() {
        try{            
            ses.shutdown();
            ses.awaitTermination(3, TimeUnit.SECONDS);
            setRunFlag(false);
            return true;
        }
        catch(Exception e){
            return false;
        }
    }

public void resume() throws InterruptedException{
        setRunFlag(true);
        //to do
} 

public void setRunFlag(boolean flag){
    this.runFlag=flag;
}

public boolean getRunFlag(){
    return runFlag;
}

public void setOuput(String output){
    this.outPut = output;
}

public String getOutput(){
    return outPut;    
}

public void startRecord(int thread_length){
    String mouseRecord=null;
    for(int i = 0; i<thread_length; i++){
        int mouseX = MouseInfo.getPointerInfo().getLocation().x;
        int mouseY = MouseInfo.getPointerInfo().getLocation().y;
        System.out.println("("+mouseX+","+mouseY+")"+i);
        mouseRecord+="("+mouseX+","+mouseY+")";
        setOuput(mouseRecord);
        try{
             applicationContext.setText(outPut);
             applicationContext.updateTextAera();
        }
        catch(Exception e){
            System.out.println("error getting instance of main "+e);
        }
    }
    setOuput(mouseRecord);


   }
}

感谢您的帮助。

0 个答案:

没有答案