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

更新时无法刷新JavaFX中的场景/节点

笪德华
2023-03-14

我是JavaFX的新手。我试图编程一个简单的图形用户界面,但我面临着那些可能相关的问题。我用文件选择器设置文件,并想做相当基本的操作:

  1. 保存最后使用的文件夹
  2. 在VBox中写入选中文件的名称

这是我的代码(编译):

import java.io.File;
import java.io.IOException;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class Main extends Application {
    public static Stage primaryStageS;
    public static Scene mainScene;

    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene((new Test(primaryStage).getScene()));
        primaryStageS = primaryStage;
        primaryStage.setTitle("Parcel Manager Main Page");
        primaryStage.initStyle(StageStyle.DECORATED);
        VBox main = new VBox(new Label("Test program"));
        mainScene = new Scene(main, 800, 600);
        primaryStage.setScene((new Test(primaryStage)).getScene());
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

    public class Object1 {
        String name;

        public Object1(File f) throws IOException {
            name = f.getName();
        }

        public String getName() {
            return name;
        }
    }

    public class Test {
        Object1 collec;
        String collecName;
        File lastFolder;
        Pane rootGroup;

        public Test(Stage stage) {
            setButtons(stage);
        }

        public void setButtons(Stage stageGoal) {
            VBox vbox = new VBox();
            Button b = getButton(stageGoal);
            vbox.getChildren().addAll(b, new Label(getCollecName() == null ? "no name" : collecName));
            final GridPane inputGridPane = new GridPane();
            GridPane.setConstraints(vbox, 0, 0);
            inputGridPane.getChildren().addAll(vbox);
            rootGroup = new VBox(12);
            rootGroup.getChildren().addAll(inputGridPane);
            rootGroup.setPadding(new Insets(12, 12, 12, 12));
        }

        public Button getButton(Stage stage) {
            FileChooser fileChooserParcel = new FileChooser();
            fileChooserParcel.setInitialDirectory(getLastFolder());
            Button button = new Button("Select a File");
            button.setOnAction(e -> {
                File f = fileChooserParcel.showOpenDialog(stage);
                if (f != null) {
                    try {
                        collec = new Object1(f);
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    setLastFolder(f.getParentFile());
                    setCollecName(collec);
                    setButtons(stage); // tried to reload every buttons - doesn't work
                    stage.setWidth(stage.getWidth() + 0.0001); // found this dirty hack but doesn't work
                }
            });
            return button;
        }

        public void setCollecName(Object1 o1) {
            collecName = o1.getName();
        }

        public String getCollecName() {
            return collecName;
        }

        public File getLastFolder() {
            return lastFolder;
        }

        public void setLastFolder(File folder) {
            System.out.println("set last folder: " + folder);
            lastFolder = folder;
        }

        private Scene getScene() {
            return new Scene(rootGroup, 800, 600);
        }
    }
}

我无法刷新节点以设置当前初始目录或在VBox上显示collecName。我试图通过重新加载对象或调整窗口大小来重新生成它们,但没有任何效果。当我在控制台上打印变量时,我看到它们发生了变化。但尚未找到任何对象的刷新方法。

我打赌这是一个设计程序的问题,但我上周一直在移动东西,不知道如何解决这个问题。

谢谢

共有1个答案

贺立果
2023-03-14

您只需设置一次初始目录。我想您希望在每次单击按钮时设置它。因此,将这行代码移动到处理程序内部。

将下面的getButton()方法与您的方法进行比较。

public Button getButton(Stage stage) {
    FileChooser fileChooserParcel = new FileChooser();
    Button button = new Button("Select a File");
    button.setOnAction(e -> {
        fileChooserParcel.setInitialDirectory(getLastFolder()); // CHANGE HERE.
        File f = fileChooserParcel.showOpenDialog(stage);
        if (f != null) {
            try {
                collec = new Object1(f);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            setLastFolder(f.getParentFile());
            setCollecName(collec);
            setButtons(stage); // tried to reload every buttons - doesn't work
            stage.setWidth(stage.getWidth() + 0.0001); // found this dirty hack but doesn't work
        }
    });
    return button;
}

 类似资料:
  • 对我如何做到这一点有什么建议吗? 这是我到目前为止编写的代码,但它似乎忽略了Thread.Sleep并且只使第三个代码变为蓝色。

  • 我是的新手,我有一个和多个场景,我可以使用在它们之间切换,所有工作都很好,直到我尝试在单击菜单项时做一些事情而不是显示场景。 我试图通过使用方法类中调用,在那里我有菜单项action methods,我调用在单击菜单项时将文本写入方法中的文本字段,但在加载该场景的控制器后,什么都没有发生。这是我的代码: 类 家庭控制器类 我知道我可能忽略了一些东西,但我不知道它是什么,帮助将不胜感激。

  • 问题内容: 我正在寻找某种有关组织应用程序的建议。 当您拥有包含内容选择的主菜单时,请按一个按钮,则获取控制器有两个选择:a)更改当前显示主菜单的内容b)创建一个新场景并将舞台切换到该场景一 你在用什么 有什么最佳实践吗? 目前,我更喜欢a),因为我可以保持事物链接状态栏等,但这是“干净”的方式吗? 问题答案: 首先,需要考虑一些事情: 1)更改场景将取消链接到您附加到该事件处理程序的链接,并且可

  • 接口说明 操作场景产生的信息json,需要提交到服务端进行保存,以便下次查看场景的时候,可以正常访问到对该场景操作过得信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/scene/1.0.0/upload 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 场景ID

  • 问题内容: 我正在尝试学习JavaFX,并将swing应用程序转换为JavaFX。我想做的是使用JavaFX来显示程序的进度。 我以前在Swing中所做的是首先使用自定义JComponent创建一个JFrame。然后让我的主程序调用自定义JComponent的方法,该方法将更改JComponent和repaint()中的形状颜色。 下面给出了我想在JavaFX中实现的目标的想法: 我目前将此作为我