我想知道如何共享应用程序上下文。即我有一个主控制器,我初始化和更新我的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);
}
}
感谢您的帮助。