当前位置: 首页 > 知识库问答 >
问题:

JavaFX——ChangeLisener问题和从场景中打开场景

诸葛文博
2023-03-14

我写信是为了获取有关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:参数类型不匹配每次都有异常吗?

谢谢你抽出时间!

共有1个答案

唐永春
2023-03-14

您似乎试图将一个控制器类用于两个不同的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类不知道如何启动游戏等,因为所有代码(以及加载初始开始菜单的代码)都在我的主类中,所以我尝试了这样的事情: 我尝试使用一个函数来切换场景,但它不起作用,也试图使用获

  • 我希望此图表显示在场景生成器上。怎么可能。。??