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

JavaFX:将SimpleLongProperty绑定到标签,并将长值格式化为人类可读的文件大小

古扬
2023-03-14

我有一个绑定到两个属性的标签。第一个值(DeletedFileCountProperty)是一个简单的int,无需格式化。但是,如何将第二个属性(SimpleLongProperty)格式化为人类可读的filesize值?

示例:deletedFilesSize的值为1000000。标签应显示“1MB”。

我可以调用绑定中的man ReadableByteCount函数来让此函数格式化值吗?

迄今为止我的代码:

public class MainController implements Initializable {
    private final SimpleIntegerProperty deletedFilesCount = new SimpleIntegerProperty();
    private final SimpleLongProperty deletedFilesSize = new SimpleLongProperty();

    @FXML
    Label deletedFilesLabel;


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        deletedFilesLabel.textProperty().bind(Bindings.format("Deleted files: %d (%d)", deletedFilesCountProperty(), deletedFilesSizeProperty()));
    }

    /**
    * formats a long number to a human readable file size value
    * returns something like: 2MB or 4GB and so on instead of very long Long values.
    */
    public static String humanReadableByteCount(long bytes, boolean si) {
        int unit = si ? 1000 : 1024;
        if (bytes < unit)
            return bytes + " B";
        int exp = (int) (Math.log(bytes) / Math.log(unit));
        String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
        return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
    }
}

谢谢

共有1个答案

云承弼
2023-03-14

您可以这样做,例如:

fileSizeLabel.bind(Bindings.createStringBinding(
    () -> humanReadableByteCount(deletedFilesSize.get(), false),
    deletedFilesSize
));

deletedFilesLabel.textProperty().bind(Bindings.createStringBinding(
    () -> String.format(
        "Deleted files: %d (%s)",
        deletedFilesCountProperty().get(), 
        humanReadableByteCount(deletedFilesSizeProperty().get(), false)
    ),
    deletedFilesCountProperty(),
    deletedFilesSizeProperty()
));
 类似资料:
  • 我在JavaFX应用程序中使用MVP。 资源: 控制器: 看法 在我的InfoStageView中,只需初始化我的标签和样式我的视图。 如何将我的超链接绑定到我的标签。我尝试了一些方法,但没有成功。我的StringProperty不可点击,但很容易绑定。 我的目标:我想打开带有链接的浏览器。

  • 我有一个文本字段,用户在其中输入工资。TF有一个基于默认语言环境的TextFormatter。文本字段旁边有一个标签,在这个标签中,我想显示格式为货币的文本字段文本,为此,我使用以下代码: 如您所见,标签文本没有格式化为数字-因为没有应用格式化程序-。所以我的问题是如何使标签的文本格式化并同时与TextField TextProperty绑定。 有人可能会问:为什么不使用货币格式化程序而不是数字格

  • 我是FX新手,对Java不太陌生,所以请耐心等待!我有一个简单的应用程序,它使用一个由ObservableList支持的JavaFX TableView。 当我第一次启动应用程序时,我生成了另一个Thread(从Application的start方法)来监听对日志文件的更改并将另一个元素添加到观察列表中,以便在TableView中立即可见该行。我认为在窗口中有一个包含当前大小的Label会很有好处

  • 问题内容: 如何在Java中将字节大小转换为人类可读的格式? 像1024应该变成“ 1 Kb”,而1024 * 1024应该变成“ 1 Mb”。 我有点讨厌为每个项目编写此实用程序方法。在Apache Commons中有一个静态方法吗? 问题答案: 有趣的事实:此处发布的原始代码段是有史以来复制最多的Java代码段,并且存在缺陷。它是固定的,但变得混乱。 本文全文:有史以来复制最多的Stack O

  • 问题内容: 给定文件大小(以字节为单位),我想使用 IEC(二进制)前缀 将其格式化为 3个 有效数字, 并带有结尾的零,例如1883954变为1.80M。 bash不支持浮点算术,因此我改用awk。问题是我不怎么保持尾随零。当前解决方案: (文件不是那么大,所以我不必考虑更大的单位。) 编辑:这还有另一个问题。请参阅下面的AdrianFrühwirth的评论。 问题答案: GNU Coreuti

  • 我想绑定JavaFX与值。 我试过了,例如。 或 但我总是得到NullPointerException。 我怎么才能修好它?