- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
对于数字输入,有时将模拟控件同步到文本显示会很方便。在这个 Swing 中example ,一个 JSpinner
和一个 JSlider
各自监听变化事件,并且各自更新对方的模型以匹配。一个类似的 JavaFX 程序,如下所示,连接一个 Spinner
和一个 Slider
,并且这些听众保持控件的协调:
slider.valueProperty().addListener((Observable o) -> {
spinner.getValueFactory().setValue(slider.getValue());
});
spinner.valueProperty().addListener((Observable o) -> {
slider.setValue((double) spinner.getValue());
});
不幸的是,当我将 StringConverter
添加到微调器的 SpinnerValueFactory
时,初始值是未格式化的,直到任一控件发生更改 — 即使再次显式设置初始值,< em>在 添加转换器之后:
spinner.getValueFactory().setConverter(…);
spinner.getValueFactory().setValue(INITIAL_VALUE);
我哪里错了?
import java.text.NumberFormat;
import javafx.application.Application;
import javafx.beans.Observable;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.control.Spinner;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.converter.PercentageStringConverter;
/**
* @see https://stackoverflow.com/a/6067986/230513
*/
public class SpinSlider extends Application {
private static final double MIN = 0;
private static final double MAX = 1;
private static final double INITIAL_VALUE = 0.5;
private static final double STEP_INCREMENT = 0.1;
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("SpinSlider");
Slider slider = new Slider(MIN, MAX, INITIAL_VALUE);
slider.setBlockIncrement(STEP_INCREMENT);
Spinner spinner = new Spinner(MIN, MAX, INITIAL_VALUE, STEP_INCREMENT);
spinner.getValueFactory().setConverter(
new PercentageStringConverter(NumberFormat.getPercentInstance()));
spinner.getValueFactory().setValue(INITIAL_VALUE);
slider.valueProperty().addListener((Observable o) -> {
spinner.getValueFactory().setValue(slider.getValue());
});
spinner.valueProperty().addListener((Observable o) -> {
slider.setValue((double) spinner.getValue());
});
GridPane root = new GridPane();
root.addRow(0, slider, spinner);
root.setPadding(new Insets(8, 8, 8, 8));
root.setHgap(8);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
最佳答案
您的 INITIAL_VALUE
首先用作微调器构造函数的 initialValue
参数。在内部,旋转器的混凝土 SpinnerValueFactory
是一个 DoubleSpinnerValueFactory
,它将 ChangeListener
添加到它的 value
属性;当再次设置初始值时,该值并没有真正改变。有两种方法:
为构造函数指定一个不同的值,并在添加转换器后设置所需的值:
Spinner spinner = new Spinner(MIN, MAX, -42, STEP_INCREMENT);
spinner.getValueFactory().setConverter(…);
spinner.getValueFactory().setValue(INITIAL_VALUE);
构造一个具有所需初始值的 SpinnerValueFactory
并使用它来构造微调器:
SpinnerValueFactory factory = new SpinnerValueFactory
.DoubleSpinnerValueFactory(MIN, MAX, INITIAL_VALUE, STEP_INCREMENT);
factory.setConverter(…);
Spinner spinner = new Spinner(factory);
此外,下面的示例将两个监听器替换为双向绑定(bind),它使用弱监听器来允许对属性进行垃圾回收:
slider.valueProperty().bindBidirectional(
spinner.getValueFactory().valueProperty());
简单地说,微调器和 slider 可以相互控制。更常见的是,每个模型都可以在控制另一个模型持有的属性的过程中保持同步:
model.xProperty().bindBidirectional(slider.valueProperty());
model.xProperty().bindBidirectional(spinner.getValueFactory().valueProperty());
import java.text.NumberFormat;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.converter.PercentageStringConverter;
/**
* @see https://stackoverflow.com/a/55427307/230513
* @see https://stackoverflow.com/a/6067986/230513
*/
public class SpinSlider extends Application {
private static final double MIN = 0;
private static final double MAX = 1;
private static final double INITIAL_VALUE = 0.5;
private static final double STEP_INCREMENT = 0.1;
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("SpinSlider");
Slider slider = new Slider(MIN, MAX, INITIAL_VALUE);
slider.setBlockIncrement(STEP_INCREMENT);
SpinnerValueFactory factory = new SpinnerValueFactory
.DoubleSpinnerValueFactory(MIN, MAX, INITIAL_VALUE, STEP_INCREMENT);
factory.setConverter(new PercentageStringConverter(
NumberFormat.getPercentInstance()));
Spinner spinner = new Spinner(factory);
slider.valueProperty().bindBidirectional(spinner.getValueFactory().valueProperty());
GridPane root = new GridPane();
root.addRow(0, slider, spinner);
root.setPadding(new Insets(8, 8, 8, 8));
root.setHgap(8);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
关于java - 连接具有 StringConverter 的 slider 和微调器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55427306/
我正在尝试使用属性网格来显示数据。我必须为预定义的字符串常量编写 StringConverters,以便它们可以显示在组合框中。 考虑一个颜色列表和另一个角度列表 0,90,180,270。我想在网格
我正在尝试在 JavaFX 的表格中创建一个组合框表格单元格。我使用了字符串转换器,以便 false 在表中显示“否”,而 true 在表中显示"is",并且这是有效的。但是,当我单击单元格进行编辑时
我在创建可编辑的 ListView 时遇到了一些小问题。 所以我有一个包含两个字段的城市类:id 和 name,我从数据库中创建了一个城市 ObservableList 并将其分配给我的 ListVi
我在代码中有类似的东西 SqlFunctions.StringConvert( (double?) x.Latitude) 但它总是返回一个整数,尽管它有一个纬度值。 有什么帮助吗? 最佳答案 Sql
我正在将应用程序迁移到 .net 核心。但 SqlFunctions.StringConvert() 在 .netcore 中不起作用。 我正在使用以下代码: using (var entity =
在我的 ViewModel 中,我返回以下下拉列表: public IEnumerable Statuses { get { using
我有一个组合框,我想用数据库中的数据填充它。使用以下代码,ComboBox 中显示的数据是值的 ID,而不是 string 值。 (部分)Java Controller 代码: @FXML C
我一直在学习表达式并使用下面的代码添加构建针对数据库模型的表达式(EF4 - ORACLE 而不是 SQL!) 这对 Oracle 非常有效,并允许我动态地构建谓词,例如 "CustomerId",
对于数字输入,有时将模拟控件同步到文本显示会很方便。在这个 Swing 中example ,一个 JSpinner 和一个 JSlider 各自监听变化事件,并且各自更新对方的模型以匹配。一个类似的
当我在“Excel 应用范围”中创建“读取单元格”时,我尝试使用“写入行”从 Excel 中输出读取的数据。但是,它不起作用,它会输出标题中的错误。有人能补吗? 最佳答案 我遇到过同样的问题。我正在使
我正在使用 EF 4 并尝试使用 Moq 对以下行进行单元测试: var convertError = models .Where(x => SqlFunctions.Str
我有一个简单的 slider 和一个普通的标签。标签的内容绑定(bind)到 slider 的值并且工作正常 - 当您移动 slider 时,标签的内容会发生变化,例如 23.3983928394 、
问题 需要使用 EF4 + SQL CE4 将 int 转换为 string。使用 SqlFunctions.StringConvert(double) 的推荐选项仍然给我错误。 选项 1 (原来的)
在之前的SO question当我的 POCO 中有字符串属性时,我询问如何更改 MySql 列类型。 我自己回答的答案是实现我自己的 StringConverter。我认为这是一种可以接受的方法。
我不明白为什么会出现此错误。我已经在以前版本的 Entity Framework 中成功地使用了这个函数,但是我已经使用 EF6 设置了一个新项目并且它没有合作。 using System.Data;
我是一名优秀的程序员,十分优秀!