JavaFX控制器类不工作
我真的很难理解JavaFX控制器,我的目标是写一个TextArea作为日志 我的代码如下,但我希望能够更改另一个类的值等,我可以在需要时调用该类。我试图创建一个可初始化的控制器类,但无法使其工作。有人能把我引向正确的方向吗 我想将底部的@FXML代码移动到另一个类,它会更新场景JavaFX控制器类不工作,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,我真的很难理解JavaFX控制器,我的目标是写一个TextArea作为日志 我的代码如下,但我希望能够更改另一个类的值等,我可以在需要时调用该类。我试图创建一个可初始化的控制器类,但无法使其工作。有人能把我引向正确的方向吗 我想将底部的@FXML代码移动到另一个类,它会更新场景 package application; import javafx.event.ActionEvent; import javafx.scene.control.Label; import javafx.scene.c
package application;
import javafx.event.ActionEvent;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Parent root = FXMLLoader.load(getClass().getResource("Root.fxml"));
Scene scene = new Scene(root,504,325);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
public Thread thread = new Thread(new webimporter());
@FXML
public Label runningLabel;
@FXML
public TextArea txtArea;
@FXML
void runClick(ActionEvent event) throws IOException{
changeLabelValue("Importer running...");
thread.start();
}
@FXML
protected void stopClick(ActionEvent event){
changeLabelValue("Importer stopped...");
thread.interrupt();
}
@FXML
void changeLabelValue(String newText){
runningLabel.setText(newText);
}
void changeTextAreaValue(String newText1){
txtArea.setText(newText1);
}
}
不要使应用程序类成为控制器。这是一种罪恶。还有其他问题和答案可以解决这个问题,但我的搜索技能目前无法找到它们 这是一种罪恶的原因是:
textlogger/Root.fxml textlogger.WebImporter.java
不要使应用程序类成为控制器。这是一种罪恶。还有其他问题和答案可以解决这个问题,但我的搜索技能目前无法找到它们 这是一种罪恶的原因是:
textlogger/Root.fxml textlogger.WebImporter.java
我可以让它显示出来并很好地工作,但我无法从我在线程中创建的类中计算出如何在文本区域中写作。当你不提供文本时,你会让我做更多的工作来帮助你解决问题。当你无法掌握一个概念时,很难完全解释它。是的,我知道,提出好的问题比写答案更难。希望这里的信息能对你有所帮助。谢谢你,你已经解决了我的问题。在没有人指导的情况下学习Java并非易事。我买的那本书《用Java开始为傻瓜编程》就是这么好。它教会我将应用程序类用作控制器。我以后不会这样做。我设法解决了如何在场景生成器中指定新控制器的问题。你帮助我学会了如何将TextArea解析到类中,这帮了我很多忙。我不明白“扩展任务{”但是我猜多态性或者你可以将一个类复制到你自己的类中的一种方法。我可以让它显示出来并工作得很好,但是我无法从我在线程中创建的类中计算出如何在文本区域中编写。当你不提供多态性时,你会让我做更多的工作来帮助你解决问题。当你不能掌握一个概念时,很难完全理解它y解释一下。是的,我知道,提出好问题比写答案更难。希望这里的信息能帮助你。谢谢你,你解决了我的问题。在没有人指导的情况下学习Java不是一件容易的事。我买的书《用Java开始为傻瓜编程》非常好。它教会了我如何将应用程序类用作控制器。我以后不会这样做。我设法解决了如何在场景生成器中指定新控制器的问题。您帮助我学会了如何将TextArea解析到类中,这对我帮助无穷。我不理解“扩展任务{”但我想多态性或者说是将类复制到自己的类中的一种方法。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefWidth="400.0" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="textlogger.ImportController">
<children>
<HBox alignment="BASELINE_LEFT" minHeight="-Infinity" minWidth="-Infinity" spacing="10.0">
<children>
<Button mnemonicParsing="false" onAction="#run" text="Run" />
<Button mnemonicParsing="false" onAction="#stop" text="Stop" />
<Label fx:id="runningLabel" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</HBox>
<TextArea fx:id="textArea" editable="false" prefHeight="200.0" prefWidth="200.0" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</VBox>
package textlogger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import java.io.IOException;
public class ImportController {
@FXML
private Label runningLabel;
@FXML
private TextArea textArea;
private WebImporter importer;
@FXML
void run(ActionEvent event) throws IOException {
changeLabelValue("Importer running...");
if (importer == null) {
importer = new WebImporter(textArea);
Thread thread = new Thread(
importer
);
thread.setDaemon(true);
thread.start();
}
}
@FXML
void stop(ActionEvent event){
changeLabelValue("Importer stopped...");
if (importer != null) {
importer.cancel();
importer = null;
}
}
private void changeLabelValue(String newText){
runningLabel.setText(newText);
}
}
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.control.TextArea;
import java.time.LocalTime;
public class WebImporter extends Task<Void> {
private final TextArea textArea;
public WebImporter(TextArea textArea) {
this.textArea = textArea;
}
@Override
protected Void call() throws Exception {
try {
while (!isCancelled()) {
Thread.sleep(500);
Platform.runLater(
() -> textArea.setText(
textArea.getText() + LocalTime.now() + "\n"
)
);
}
} catch (InterruptedException e) {
Thread.interrupted();
}
return null;
}
}
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TextLoggingSample extends Application {
@Override
public void start(Stage stage) {
try {
FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(
getClass().getResourceAsStream(
"Root.fxml"
)
);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}