【问题标题】:What is the best way to make a checkbox remember it's state?使复选框记住其状态的最佳方法是什么?
【发布时间】:2016-12-25 23:35:28
【问题描述】:

我有一个使用许多复选框的 javafx 应用程序。当一个复选框被选中时,一个按钮将出现在主窗口中。复选框设置为“false”使按钮消失。很容易。

问题是复选框不记得它被选中并且应用程序总是以选中的复选框开始,如 fxml 文件中定义的那样:

<CheckBox fx:id="googleHider" onAction="#hideGoogle" selected="true" text="Google">

由于我在 Google 上找不到任何令人满意的东西,我想出了一个自制的解决方案,设置一个函数,直接在 fxml 文档中将复选框的选中状态设置为“true”或“false”,这很有效完美。

我只是想知道这是否是一种简单有效的良好做法,或者是否有人已经找到或可以想象出更优雅或更简约的解决方案。 (我之前的编程经验更多的是Python,不知道有没有表现出来。有没有更“Javaian”的方式……?)

boolean isSelected = googleHider.isSelected();


    if (isSelected == false) {

        System.out.println("not selected");
        Path path = Paths.get("src/javafxapplication2/PopupFXML.fxml");
        Charset charset = StandardCharsets.UTF_8;
        String content = new String(Files.readAllBytes(path));
        //following line changes the initial state of the checkbox from "true" to "false"
        content = content.replaceAll("\"#hideGoogle\" selected=\"true\"", "\"#hideGoogle\" selected=\"false\"");
        Files.write(path, content.getBytes(charset));

    }
    else {
        System.out.println("selected");
        Path path = Paths.get("src/javafxapplication2/PopupFXML.fxml");
        Charset charset = StandardCharsets.UTF_8;
        String content = new String(Files.readAllBytes(path));
        // next line changes the state back from "false" to "true" 
        content = content.replaceAll("\"#hideGoogle\" selected=\"false\"", "\"#hideGoogle\" selected=\"true\"");
        Files.write(path, content.getBytes(charset));

    }

【问题讨论】:

  • 虽然我喜欢你的方法,因为它是开箱即用的,但我仍然认为更清晰的方法是创建一个设置文件,然后在启动时从文件中读取值并关机时将值保存到文件中
  • 好主意,这个设置文件在 javafx 应用程序中的理想位置是什么?它会是一个txt.file吗?您知道任何文档或更清晰的方向吗?
  • @Rainer 至于位置,用户主目录似乎是一个显而易见的选择...stackoverflow.com/questions/585534/…

标签: java checkbox javafx


【解决方案1】:

我肯定会使用设置文件。这样的设置文件不应位于您的应用程序中,因为您不能总是在应用程序执行时对其进行修改。好的位置是 AppData 文件夹(在 windows 上)或用户目录(在 linux 和 mac 上)或保存应用程序的文件夹。

我写了一个小库,创建*.properties-files 并将它们保存在 AppData 文件夹(或用户目录,如果不在 Windows 上),你也可以使用它:Common

【讨论】:

    【解决方案2】:

    您可以创建SharedPrefrences 并使用.putBoolean() 增加价值。

    if(ch.isSelected()){             
    
    SharedPreferences settings = getSharedPreferences(PREFRENCES_NAME, 0);
    settings.edit().putBoolean("check",true).commit();
    }
    

    您可以通过多种方式做到这一点。在下面提供的链接中,您将了解用户会话管理和活动之间共享数据的基本概念。

    http://www.androidhive.info/2012/08/android-session-management-using-shared-preferences/

    【讨论】:

    • 不错的功能 .. 似乎在 java 中不起作用...你在 java 或 javafx 中是否有类似的东西?
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多