【问题标题】:How can I set 3 values in spinner如何在微调器中设置 3 个值
【发布时间】:2015-06-17 08:53:33
【问题描述】:

我想要一个微调器中的时间,例如 02:25:12AM 小时、分钟、秒。我怎样才能做到这一点?我只为一个价值做过,比如

<Spinner fx:id="spinner" layoutX="350.0" layoutY="10.0" initialValue="60"        
         max="120"  prefHeight="25.0" prefWidth="60.0" />

它显示像

这样的错误

javaFx.scene.control.Spinner 不支持 min/max/initial 属性

但它工作正常。现在我想为 3 个值执行此操作。

【问题讨论】:

  • 您可以使用 3 个微调器,这样更方便,因为您无需“向上”单击 60 次即可添加一分钟,只需单击“分钟”微调器 1 次 ;)

标签: spinner javafx-8 fxml netbeans-8 jspinner


【解决方案1】:

正如@UlukBiy 在 cmets 中所说,您可能想在这里使用三个微调器。您可能还想实现“环绕”,这样如果您增加超过 59 的秒数,它会重置为 0 并且分钟增量等。

此外,要设置最小值和最大值,请将它们设置在 SpinnerValueFactory 上,而不是 Spinner 本身上。请参阅 SpinnerSpinnerValueFactorySpinnerValueFactory.IntegerSpinnerValueFactory 的 Javadocs。

这是一个完整的例子(FXML):

TimeSpinner.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Spinner?>
<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory ?>

<HBox  xmlns:fx="http://javafx.com/fxml/1" fx:controller="TimeSpinnerController">
    <Spinner fx:id="hourSpinner" prefWidth="60">
        <valueFactory>
            <javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory fx:id="hourValueFactory">
                <min>0</min>
                <max>23</max>
                <wrapAround>true</wrapAround>
            </javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory>
        </valueFactory>
    </Spinner>
    <Spinner fx:id="minuteSpinner" prefWidth="60">
        <valueFactory>
            <javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory fx:id="minuteValueFactory">
                <min>0</min>
                <max>59</max>
                <wrapAround>true</wrapAround>
            </javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory>>
        </valueFactory>
    </Spinner>
    <Spinner fx:id="secondSpinner" prefWidth="60">
        <valueFactory>
            <javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory fx:id="secondValueFactory">
                <min>0</min>
                <max>59</max>
                <wrapAround>true</wrapAround>
            </javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory>>
        </valueFactory>
    </Spinner>
</HBox>

TimeSpinnerController:

import java.time.Duration;

import javafx.beans.binding.Bindings;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.fxml.FXML;
import javafx.scene.control.Spinner;



public class TimeSpinnerController {

    @FXML
    private Spinner<Integer> hourSpinner ;
    @FXML
    private Spinner<Integer> minuteSpinner ;
    @FXML
    private Spinner<Integer> secondSpinner ;

    private ReadOnlyObjectWrapper<Duration> time = new ReadOnlyObjectWrapper<>();

    public void initialize() {
        minuteSpinner.valueProperty().addListener((obs, oldValue, newValue) -> {
            if (oldValue.intValue() == 59 && newValue.intValue() == 0) {
                hourSpinner.increment();
            }
            if (oldValue.intValue() == 0 && newValue.intValue() == 59) {
                hourSpinner.decrement();
            }
        });

        secondSpinner.valueProperty().addListener((obs, oldValue, newValue) -> {
            if (oldValue.intValue() == 59 && newValue.intValue() == 0) {
                minuteSpinner.increment();
            }
            if (oldValue.intValue() == 0 && newValue.intValue() == 59) {
                minuteSpinner.decrement();
            }
        });

        time.bind(Bindings.createObjectBinding(this::computeTime, hourSpinner.valueProperty(),
                minuteSpinner.valueProperty(), secondSpinner.valueProperty()));
    }

    public ReadOnlyObjectProperty<Duration> timeProperty() {
        return time.getReadOnlyProperty() ;
    }

    public Duration getTime() {
        return timeProperty().get();
    }

    private Duration computeTime() {
        int seconds = secondSpinner.getValue();
        int minutes = minuteSpinner.getValue();
        int hours = hourSpinner.getValue();
        int totalSeconds = (hours * 60 + minutes) * 60 + seconds ;
        return Duration.ofSeconds(totalSeconds);
    }
}

测试代码:

import java.io.IOException;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TimeSpinnerTest extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("TimeSpinner.fxml"));
        HBox timeSpinner = loader.load();
        TimeSpinnerController timeController = loader.getController() ;
        Label label = new Label();

        label.textProperty().bind(Bindings.createStringBinding(() -> {
            long s = timeController.getTime().getSeconds() ;
            return String.format("%02d:%02d:%02d", s / 3600, (s / 60) % 60, s % 60);
        }, timeController.timeProperty()));

        VBox root = new VBox(10, timeSpinner, label);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(24));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

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

【讨论】:

  • 在 fxml 中显示错误“FXML 加载器无法创建 /javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory 的实例。”
  • 虽然它运行良好但是当我设置位置值时它没有显示效果
  • 您在加载 FXML 时或仅在 SceneBuilder 中遇到该错误? FXML 加载器在尝试使用嵌套类时非常糟糕;我还没有尝试过使用场景构建器。我不明白你的第二条评论。你是什​​么意思“它没有显示效果”?
  • 我与场景构建器合作。我想更改微调器的位置,默认情况下它在父面板中采用 (0,0)。所以在第二条评论中,我更改了 x 和 y 以更改位置,但它没有不行。
  • 设置布局属性不会对HBox 中的内容产生任何影响。您可以设置HBox 的布局属性;这是否有效果取决于它的父母。但这是一个关于布局的问题,它与你原来的问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多