我不明白为什么,如果微调器调用ChangeListener两次。我怎样才能做到只打一次电话?
控制器。JAVA
public class Controller {
@FXML
Spinner<Double> spinner;
@FXML
public void initialize(){
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));
spinner.valueProperty().addListener(new ChangeListener<Double>() {
@Override
public void changed(ObservableValue<? extends Double> observable, Double oldValue, Double newValue) {
System.out.println("Old Value" + oldValue + "New Value" + newValue);
}
});
}}
主要的JAVA
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}}
输出:
Old Value 60.0 New Value 780.0
Old Value 780.0 New Value 350.0
这是因为工厂
:
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));
微调器的最大值为350。输入780:该值将更改为此值,然后由于最大值,它将更改回350。
更新:
默认情况下,当按下Enter键时,将提交
Spner
编辑器中的值。
为了避免自动绑定,您可以尝试覆盖默认提交逻辑:
spinner.getEditor().setOnAction(e -> {
String text = spinner.getEditor().getText();
SpinnerValueFactory<Double> valueFactory = spinner.getValueFactory();
if (valueFactory != null) {
StringConverter<Double> converter = valueFactory.getConverter();
if (converter != null) {
try{
Double value = converter.fromString(text);
if (value >= minValue && value <= maxValue)
valueFactory.setValue(value);
else
valueFactory.setValue(Math.max(Math.min(maxValue, value), minValue));
// This ensures that if the value us e.g. 350, then 450 entered, the text
// is updated to 350 again (rather than ramaining 450)
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
} catch(NumberFormatException nfe){
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
}
}
}
e.consume();
});
这些值定义为:
double maxValue = 350;
double minValue = 0;
spinner.setValueFactory(
new SpinnerValueFactory.DoubleSpinnerValueFactory(minValue, maxValue, 60, 1));
注:
也可以从
SpinnerValueFactory
中检索最小值和最大值-不幸的是,不是以完全干净的方式,而是通过一些铸造:
spinner.getEditor().setOnAction(e -> {
SpinnerValueFactory.DoubleSpinnerValueFactory valueFactory = (SpinnerValueFactory.DoubleSpinnerValueFactory) spinner.getValueFactory();
if (valueFactory != null) {
StringConverter<Double> converter = valueFactory.getConverter();
if (converter != null) {
try {
valueFactory.setValue(Math.max(Math.min(valueFactory.getMax(),
converter.fromString(spinner.getEditor().getText())), valueFactory.getMin()));
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
} catch(NumberFormatException nfe){
spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
}
}
}
e.consume();
});
但在这种情况下,不必存储最小值和最大值,它们是从工厂本身获得的:
spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 350, 60, 1));
我正试图让一个旋转器(2)改变另一个旋转器(1)的内容。 我当前在第二个微调器的数组适配器中遇到错误“错误:(28,57)错误:无法推断数组适配器的类型参数 这是我的代码: 任何帮助都将不胜感激。
我有一个ImageView,可以用鼠标拖放,点击按钮旋转90度。这两件事在独立完成时都可以工作(因此可以旋转或移动ImageView,而不是两者都可以)。当我旋转ImageView并尝试移动它时,它似乎是随机移动的。 我使用以下方法旋转图像视图: 这导致了我所说的看似随机的运动。 我还尝试使用以下方法旋转ImageView: 位置是图像在屏幕上的位置。宽度和高度是ImageView的宽度和高度。
我正在用一艘宇宙飞船做一个游戏,当按下“前进”按钮时,后面会出现一个火的图像。这只在太空船垂直站立时起作用。当它倒转时,它与宇宙飞船的后部没有完全对齐。这是我为其创建的类的更新函数。 我试着将原点设置为火箭的原点,这对我来说似乎是合乎逻辑的,但我认为我不完全理解原点是什么。 [编辑1] 我不认为问题出在原点上,我现在把它设置为 我认为这个问题与我总是将y设置为(火箭弹射出的火的高度是火箭弹高度的一
我在这个网站上看到过关于javafx中旋转的问题,但我似乎不太明白。下面是一些代码: 为什么当我改变角度时,矩形开始出现在随机位置?例如,当我将角度设置为 180 时,矩形出现在中间。我的理解是,矩形围绕 X:150 和 Y:225 以指定的角度移动。但是,当我将角度设置为180时,我完全错了。你们能帮帮我吗? 编辑:在阅读和看到回答这个问题的代码时,我想我发现了一个新问题。如何设置pivotX和
我的程序以前工作得很好,我将我的场景构建器从JavaFx场景构建器2.0改为gluon场景构建器10,以添加一些CSS样式。我添加了样式,程序显示了如下错误:警告:由版本9.0.4的JavaFX运行时用版本10.0.1的JavaFX API加载FXML文档,然后我将JDK更新到版本10.0.2,但它显示了如下错误。 我的主要课程是 我的控制器类是 fontawesome版本:
我试图找出如何检测一些对象属性的变化。所以一开始我就意识到该怎么做,而且很管用。我不知道是否有更好的方法(如果你们知道是否有更好的方法,请告诉我)。 问题是,我还有另一个问题要解决,我不想检测变化,我只想获得属性的新设置值。因此,我知道使用javafx.beans.value.ChangeListener接口可以检测某个属性的每一个更改,这就是我的问题所在,因为我创建了一个实现ChangeList