如何解决使用JavaFX创建的任务,其中包含“ wait”
我使用javafx,我有一个TextField和一个Button,当按下按钮时,它将在TextField中写入的内容保存为字符串。我要创建的是一种在等待按钮按下时标记暂停的方法。
我有一个名为pause.java的类,在其中按下按钮时尝试放置obj.wait();
和notifyAll();
,但是在此期间无法访问该窗口,我无法按按钮或在TextField中输入任何内容。
所以我发现是将obj.wait();
放在一个任务中,然后我不知道为什么,但是它直接摆脱了等待。
这是我的暂停。java
package net.jpajavafx;
import java.util.logging.*;
import javafx.concurrent.Task;
public class pause {
Logger logger = Logger.getLogger(pause.class.getName());
MainController obj = new MainController();
public void waitinput() {
Task<Void> sleeper = new Task<Void>() {
@Override
protected Void call() throws Exception {
synchronized (obj) {
try {
String write = "Waiting for input...";
logger.log(Level.INFO,write);
obj.wait();
logger.log(Level.INFO,"Done");
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
};
new Thread(sleeper).start();
}
}
如何在仍然可以访问GUI的同时对其进行修改以使其等待?
这是我简化后的代码:
AlbumManager.java,我主要在哪里。
package net.jpajavafx;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.*;
import javafx.application.*;
import javafx.fxml.FXMLLoader;
public class AlbumManager extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("Album Manager");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
MainController.java:
package net.jpajavafx;
import javafx.event.ActionEvent;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.fxml.FXML;
import java.util.logging.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
public class MainController {
@FXML
private TextArea textarea;
@FXML
private TextField textfield;
Variablesstoring stock = new Variablesstoring();
public void ok(ActionEvent event) {
String getValue = textfield.getText();
stock.setEntrystr(getValue); //here i have something to put in an Int,I put it aside to reduce the length
textfield.setText("");
notifyAll();
}
public void startprogram() {
int etat = 0;
int run = 1;
while (run == 1) {
textarea.setText("1: launch method");
pause.waitinput(); // here I want to wait for an input
etat = stock.getEntrystr();
switch (etat) {
case 1:
//runs a method
break;
default:
break;
}
}
}
}
解决方法
目前还不清楚您要实现的目标是需要一个单独的线程:似乎所有单独的线程都试图等待直到按下按钮,然后执行一些代码。该功能已经由JavaFX中的事件管理系统提供(对于任何UI工具包也是如此):只需在事件处理程序中执行代码即可。
(顺便说一句,您对wait()
的使用是不正确的,并且如果您对此进行了修复,则该线程将永远不会唤醒,因为您没有在要调用的同一对象上调用notifyAll()
wait()
。)
您可以简单地实现您似乎想做的事情
package net.jpajavafx;
import javafx.event.ActionEvent;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.fxml.FXML;
import java.util.logging.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
public class MainController {
@FXML
private TextArea textarea;
@FXML
private TextField textfield;
Variablesstoring stock = new Variablesstoring();
public void ok(ActionEvent event) {
String getValue = textfield.getText();
stock.setEntrystr(getValue); //here i have something to put in an Int,I put it aside to reduce the length
textfield.setText("");
processInput();
}
public void processInput() {
int etat = stock.getEntrystr();
switch (etat) {
case 1:
//runs a method
break;
default:
break;
}
}
}
,
您必须start another thread using a Runnable,所以保存操作完成时,不会阻塞UI线程。
您可以通过在按钮上放置一个侦听器来执行此操作,单击该按钮后,将在新线程上启动保存操作。 在启动新线程的按钮上添加侦听器的代码如下所示:
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
MainController controller = new MainController();
controller.start();
}
};
//Registering the event filter
button.addEventFilter(MouseEvent.MOUSE_CLICKED,eventHandler);
您发布的代码实际上没有任何作用。您对waitinput()
的呼叫仅记录并呼叫wait()
。 wait()
不是您想要的,因为此操作旨在使线程处于挂起状态直到被通知,而不是为了在单独的线程中执行任务。删除obj.wait()
,并添加一个单击该按钮时调用您的日志记录方法的侦听器。另外,摆脱while循环。 EventHandler将在后台处理事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。