我写信是为了获取有关JavaFX的一些信息。我使用SceneBuilder设计了一个应用程序,它有一个主要场景,由几个文本字段和用于浏览文件的按钮组成。程序运行后还有一个用于输出的文本区域。我在控制器的初始化方法中添加了更改侦听器,以便在更新输出文本区域时修改日志文件。
最初,我使用输出文本区域来显示日志文件,对其进行了测试。一旦我从主文件菜单中选择了“查看日志”菜单项,我就能够在这个输出文本区域中正确地记录和显示日志。我遇到了一个问题,这个问题似乎没有很好地解决,当我显示日志时,它想同时记录该显示。我想不出一个干净的解决办法,于是决定在自己的第二个弹出场景中打开日志。
我的一个问题是,如果我在Controller的初始化方法中的输出文本区域上放置一个更改侦听器,当我尝试“查看日志”时,它会抛出一个空指针异常并将我指向添加更改侦听器的行。但请注意,尽管它在尝试打开日志窗口时抛出此异常,但更改侦听器和输出文本区域仍然可以正常工作。
如果我删除了change listener,窗口会很好地打开,但是LogFileOutputExtArea中没有更新任何内容。
控制器文件:
public class AppController implements Initializable
{
@FXML
private TextArea logFileOutputTextArea;
@Override
public void initialize(URL url, ResourceBundle rb)
{
verifierOutputTextArea.textProperty().addListener(new ChangeListener<String>()
{
@Override
public void changed(ObservableValue<? extends String> ov, String t, String t1)
{
// IF we have a valid file
if (verifierOutputTextArea.textProperty().getValue().equals("Valid"))
{
openOutputFolderButton.visibleProperty().setValue(!openOutputFolderButton.visibleProperty()
.getValue());
}
}
});
verifierOutputTextArea.textProperty().addListener(new ChangeListener<String>()
{
@Override
public void changed(ObservableValue<? extends String> ov, String t, String t1)
{
appendLog(verifierOutputTextArea.textProperty().getValue()); // append the output to the log
}
});
// Check for a preset input file location
checkDefaultInputDirectory();
} // END INITIALIZE
@FXML
private void openLog()
{
try
{
Stage dialogStage = new Stage();
Parent root = FXMLLoader.load(getClass().getResource("fxml/logwindow.fxml"));
Scene scene = new Scene(root);
dialogStage.setScene(scene);
dialogStage.setTitle("Log");
dialogStage.show();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
Path logFilePath = Paths.get(StaticTools.LOG_FILE_LOCATION);
// IF the file doesn't exist
if (!Files.exists(logFilePath))
{
this.logFileOutputTextArea.textProperty().setValue("Log has not been created yet!");
}
else
{
try
{
byte[] fileByteArray = Files.readAllBytes(logFilePath);
this.logFileOutputTextArea.setText(StaticTools.cryptTool(new String(fileByteArray), Cipher.DECRYPT_MODE));
}
catch (IOException e)
{
e.printStackTrace();
}
}
} // END OPENLOG
} // END CONTROLLER
日志窗口。fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" minHeight="-Infinity" minWidth="-Infinity" prefHeight="304.0"
prefWidth="478.0" xmlns="http://javafx.com/javafx/8"
fx:controller="application.javafx.AppController">
<children>
<GridPane layoutX="14.0" layoutY="22.0" prefHeight="269.0" prefWidth="446.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="20.0" vgrow="SOMETIMES"/>
<RowConstraints vgrow="SOMETIMES"/>
</rowConstraints>
<children>
<Label text="Log File">
<padding>
<Insets bottom="5.0"/>
</padding>
</Label>
<TextArea fx:id="logFileOutputTextArea" editable="false" prefHeight="200.0" prefWidth="200.0"
wrapText="true" GridPane.rowIndex="1"/>
</children>
</GridPane>
</children>
</AnchorPane>
每个fxml文件是否需要单独的控制器?为什么在initialize方法中放置initialize语句和更改侦听器会导致问题?为什么在主场景中的输出文本区域被修改后(通过清除文本或设置文本),alt Tab键切换到另一个窗口会抛出java。lang.IllegalArgumentException:参数类型不匹配
每次都有异常吗?
谢谢你抽出时间!
您似乎试图将一个控制器类用于两个不同的fxml文件:LogWindow.fxml和其他一些通过菜单项上的事件处理程序调用show Log()
的fxml文件。
如果是这种情况,您将最终得到控制器的两个实例:一个由加载“main”fxml的FXMLLoader
创建,另一个由加载LogW的FXMLLoader
创建indow.fxml.show Log()
方法正在由“main”fxml创建的实例上调用,因此它将填充“main”fxml中定义的文本区域(如果有,否则您可能会得到空指针异常)。这当然不是LogWindow.fxml中的文本区域,因此文本不会显示在那里。
您可能希望为LogWindow.fxml创建一个单独的控制器类,并在其初始化()
方法中填充文本区域。
我正在设计一款跳棋游戏,一旦游戏结束,一个新窗口就会打开,你可以开始一个新游戏,也可以退出。我对JavaFX了解不多,我一直在努力让我的代码正常工作,但我没有成功。。。 我有一个困难,我的电路板没有显示为fxml文件,但它是用Java代码创建的,并放在我的边框窗格的中心。边框窗格的顶部是fxml文件。然后,游戏结束后的另一个窗口也是另一个fxml文件: 这个fxml文件的Controller类如下
我想在一个扩展场景的类中画一张画布。当我按下场景上的按钮时,这个场景应该显示出来,这个场景是在扩展的类“GUI”中创建的。 为设置图像(我不知道要将ImageView作为子节点添加到哪个节点{类似不起作用}) 试图在画布上画画。(与上面的问题相同。在哪里添加此画布?) 类: 和类: PS:Jeah!我在这个论坛上的第一个问题。你好世界!
我需要这段java代码的帮助。我有三个场景登录场景,管理场景,和玩家场景。当我运行程序并输入用户和密码时,第二个应该打开。现在的问题是,第二个场景没有打开。它甚至连接到数据库,但第二个场景没有打开。我已经检查了代码,我看不出有什么问题。能不能请一些帮帮我,发生了什么事。
问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。
我创建了一个游戏,我想给它添加一个开始屏幕,我使用FXML添加了它,还添加了两个按钮(开始和退出)。 按下开始按钮后,我希望游戏加载场景并切换到游戏开始。我对如何做有一个粗略的想法,但我有点挣扎,因为我的SampleController类不知道如何启动游戏等,因为所有代码(以及加载初始开始菜单的代码)都在我的主类中,所以我尝试了这样的事情: 我尝试使用一个函数来切换场景,但它不起作用,也试图使用获
我希望此图表显示在场景生成器上。怎么可能。。??