gpt4 book ai didi

JavaFx:没有 ActionEvent 的 comboBox.setValue

转载 作者:行者123 更新时间:2023-11-29 05:03:45 25 4
gpt4 key购买 nike

我有带页码(1、2、3 等)的组合框。当用户选择特定页面时(通过鼠标或键盘(作为组合框可编辑))。我想显示和总页数。这就是为什么在组合框操作上我也这样做:

combobox.setValue(currentPage+"/"+totalPages)

所以最终的代码看起来像

   @FXML
private void onPageComboBoxAction(ActionEvent event){
....
combobox.setValue(currentPage+"/"+totalPages)
}

然而,这段代码又触发了一个 ActionEvent 和代码循环。所以我看到了两种可能的方式:

  1. 处理一些特定事件(但处理哪些事件以及如何处理?)
  2. 找到无需再触发一个事件即可更改组合框中的值的方法(又是如何?)

谁能帮我解决这个问题?

最佳答案

setValue(...) 更改组合框所持有的值(即它更改数据或基础模型的状态)。在我看来,您在这里真正想要的只是改变数据的显示方式。您可以通过设置纽扣单元来更改所选值的显示。

这是一个示例,其中按钮单元格跟踪所选项目和页数:

import java.util.Random;
import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.collections.ListChangeListener.Change;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class PageNumberCombo extends Application {

private static final Random RNG = new Random();

@Override
public void start(Stage primaryStage) {
ComboBox<Integer> combo = new ComboBox<>();
combo.setButtonCell(new ListCell<Integer>() {
{
itemProperty().addListener((obs, oldValue, newValue) -> update());
emptyProperty().addListener((obs, oldValue, newValue) -> update());
combo.getItems().addListener((Change<? extends Integer> c) -> update());
}

private void update() {
if (isEmpty() || getItem() == null) {
setText(null);
} else {
setText(String.format("%d / %d", getItem().intValue(), combo.getItems().size()));
}
}
});

Button reloadButton = new Button("Reload");
reloadButton.setOnAction(e -> reload(combo));

reload(combo);

HBox root = new HBox(10, combo, reloadButton);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(24));
primaryStage.setScene(new Scene(root, 240, 60));
primaryStage.show();
}

private void reload(ComboBox<Integer> combo) {
int numPages = RNG.nextInt(10) + 11 ;
combo.getItems().clear();
IntStream.rangeClosed(1, numPages).forEach(combo.getItems()::add);
}

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

如果您的 ComboBox 是可编辑的,那么按钮单元格默认是一个 TextField,组合框的 converter 用于转换文本字段中的字符串值到模型值,反之亦然。所以在这种情况下,您只需要安装一个转换器,在整数 x 和字符串 "x/total" 之间进行转换。

请注意,默认情况下,此转换器还用于显示下拉单元格中的文本,因此如果您希望这些文本显示为整数值,则需要安装 cellFactory显式创建这些单元格。

import java.util.Random;
import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class PageNumberCombo extends Application {

private static final Random RNG = new Random();

@Override
public void start(Stage primaryStage) {
ComboBox<Integer> combo = new ComboBox<>();

combo.setEditable(true);
combo.setConverter(new StringConverter<Integer>() {

@Override
public String toString(Integer object) {
return object + " / " + combo.getItems().size();
}

@Override
public Integer fromString(String string) {
int index = string.indexOf('/');
if (index < 0) {
index = string.length();
}
String text = string.substring(0, index).trim();
try {
return Integer.parseInt(text);
} catch (Exception exc) {
return 0 ;
}
}

});

combo.setCellFactory(lv -> new ListCell<Integer>() {
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null) ;
} else {
setText(item.toString());
}
}
});

Button reloadButton = new Button("Reload");
reloadButton.setOnAction(e -> reload(combo));

reload(combo);

HBox root = new HBox(10, combo, reloadButton);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(24));
primaryStage.setScene(new Scene(root, 240, 60));
primaryStage.show();
}

private void reload(ComboBox<Integer> combo) {
int numPages = RNG.nextInt(10) + 11 ;
combo.getItems().clear();
IntStream.rangeClosed(1, numPages).forEach(combo.getItems()::add);
}

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

关于JavaFx:没有 ActionEvent 的 comboBox.setValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31134196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com