我有A. fxml和B. fxml。运行Java应用程序覆盖启动方法。我想每40分钟循环(5次){打开新阶段B. fxml并等待stage.close,如果阶段关闭继续循环打开新阶段B fxml。循环五次。我尝试定时器timerment我不能。我尝试JavaFX服务我不能。我创建My线程扩展线程对象。这一次,我无法控制下一阶段的循环。当用于声明开始打开5阶段。但是我想循环等待当前阶段关闭,然后进入下一个循环。这是我的失败代码;
public class Driver extends Application {
public static Stage stage;
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource(View.SETTINGS));
Parent root = loader.load();
Scene scene = new Scene(root);
stage = primaryStage;
stage.setScene(scene);
stage.setTitle("Info Library");
stage.setResizable(false);
stage.show();
RandomQuestionThread thread = new RandomQuestionThread();
if (DBContext.settings.isAbbreviation() || DBContext.settings.isTranslation()) {
thread.start();
}
}
public static void main(String[] args) throws InterruptedException {
DBContext.settings = DBContext.getInstance().settings().getSettings();
launch(args);
HibernateUtil.getSessionFactory().close();
}
}
public class RandomQuestionThread extends Thread {
Thread randomThread = new Thread(this);
private String fxml;
private static String TITLE;
@Override
public void run() {
while (true) {
try {
Thread.sleep(DBContext.settings.getAutoQuestionTime() * 6000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for (int i = 0; i<DBContext.settings.getAutoQuestionCount(); i++) {
randomFxml();
Platform.runLater(()->{
Parent root = null;
try {
root = new FXMLLoader(getClass().getResource(fxml)).load();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.setTitle(TITLE);
stage.show();
System.out.println(currentThread().getName());
});
}
}
}
private void randomFxml() {
int start = 0;
if (DBContext.settings.isTranslation() && DBContext.settings.isAbbreviation()) {
start = new Random().nextInt(2);
} else if (DBContext.settings.isTranslation()) {
start = 1;
}
switch (start) {
case 0:
fxml = View.ABBREVIATION;
break;
case 1:
fxml = View.TRANSLATION;
break;
default:
break;
}
if (start == 0) {
TITLE = "KISALTMA SORUSU";
} else TITLE = "ÇEVİRİ SORUSU";
}
}
我需要更多的Java多线程。但在解决这个问题之后。请解释我哪里做错了。循环内写入控制台currentThread name控制台结果“Java应用程序线程”。但我设置了我的线程名“MyThread”。我很困惑。我的大脑出现了蓝屏错误。
我来修。我在主控制器init方法中使用了Timer和TimeTask。以及它的工作。但应用程序启动方法或主要方法阶段中的相同代码并没有等待。我使用了stageshowandwait()方法,但线程没有等待。但在主控制器init方法中编写了相同的代码。为什么我不知道。
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Platform.runLater(()->{
for (int i = 0; i<4; i++) {
Parent root = null;
try {
root = new FXMLLoader(getClass().getResource(View.ABBREVIATION)).load();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.setTitle("deneme");
stage.showAndWait();
}
});
}
};
timer.schedule(timerTask, 6000);
循环内写入控制台currentThread name控制台结果“Java应用程序线程”。但我设置了我的线程名“MyThread”。我很困惑。
使用平台。runLater
您计划在javafx应用程序线程而不是当前线程上执行Runnable
,这允许您修改UI,但也会导致当前线程是javafx应用程序线程,而不是调用平台的线程。稍后运行
from。。。
如果您想在窗口关闭后继续循环,您应该安排在最后一个窗口关闭后打开下一个窗口。Stage.showAndWAT()
是等待阶段结束的方便方法关闭。
对于调度,我建议使用ScheduledExecutorService
:
private ScheduledExecutorService executor;
@Override
public void stop() throws Exception {
// stop executor to allow the JVM to terminate
executor.shutdownNow();
}
@Override
public void init() throws Exception {
executor = Executors.newSingleThreadScheduledExecutor();
}
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Start");
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
// just display a "empty" scene
Scene scene = new Scene(new Pane(), 100, 100);
Stage stage = new Stage();
stage.setScene(scene);
// schedule showing the stage after 5 sec
executor.schedule(new Runnable() {
private int openCount = 5;
@Override
public void run() {
Platform.runLater(() -> {
stage.showAndWait();
if (--openCount > 0) {
// show again after 5 sec unless the window was already opened 5 times
executor.schedule(this, 5, TimeUnit.SECONDS);
}
});
}
}, 5, TimeUnit.SECONDS);
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
你已经把你的系统。出来println(currentThread()。getName())
语句转换为平台。runLater()
,这意味着它将在JavaFX应用程序线程上执行(请参阅JavaDoc)。
关于你关于安排某项任务以预定义的速率重复固定次数的问题,这篇文章可以帮助你。
查看这段代码,它们展示了一种在登录后显示新窗口的方法。当用户名和密码是正确的,它打开新的对话框。我想要一个按钮点击打开新的对话框,而不检查用户名和密码。
在Chrome中打开新窗口时,有没有办法自动打开开发者工具?
问题内容: 我是Eclipse的新手,我想知道是否有可能在我键入(Visual Studio样式)时自动打开完成窗口,而不是单击+ 吗? 问题答案: 有可能的。你可以简单地写:在大田,> > > 。 在编写Java代码时,在点之后,窗口会在可配置的时间(默认值为200毫秒)后自动打开。 通常,您可以执行的操作是添加一个自动激活触发器,例如,这样,当您要弹出窗口时,您可以键入并删除该字符(尽管我认为
新窗口打开链接 该方法可以新起webview打开页面,由于客户端窗口过多会占用较多内存,请谨慎使用 Tida.pushWindow("http://www.tmall.com/go/chn/common/u-award.php?disableptf=1"); 关闭窗口 关闭当前webview窗口 Tida.popWindow();
问题内容: 当内容的高度增加时,有什么方法可以自动向下滚动ScrollPane控件?例如,我在屏幕底部(在ScrollPane内部)有一个TitledPane,当我展开它时,我希望ScrollPane向下滚动,以便可以看到TitledPane的全部内容。 问题答案: 您可以结合使用和和来实现该行为 第一个是获取titlePane的坐标,第二个是设置scrollPane的垂直栏位置。请注意,它的范围
当我运行我的代码时,我打开了一个有3个按钮可按的窗口,我想要的是,当我按下打开新窗口的其中一个按钮时,我会“超过”上一个窗口,而不是打开一个新窗口,导致我有2个打开的窗口,而不是1个。下面是我的Guicontroller: --添加更多信息。这是我使用的另一个类: