[英]JavaFx: ComboBox editor's text
我正在使用此答案中建議的comboBox: JavaFx:顯示DatePicker ,但是顯示正確的文本時出現問題。 如果我從DatePicker中選擇一個日期,我會嘗試設置編輯器的文本,但不會發生任何事情。 這是我嘗試過的:
getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->{
if (newValue != null) {
if (MyTupe.DATE.equals(newValue.getType())) {
initDatePicker();
datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
newValue.setValue(newDate);
getEditor().setText(newDate.toString());
datePopOver.hide();
});
StackPane stackPane = new StackPane(datePicker);
stackPane.setPadding(new Insets(10, 10, 10, 10));
datePopOver.setContentNode(stackPane);
datePopOver.show(this);
} else {
datePopOver.hide();
}
}
});
經過大量實驗后,我將兩個事件添加到編輯器的textProperty和setOnMouseClicked中,如下所示:
getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("Text changed");
});
setOnMouseClicked(event -> {
System.out.println(getEditor().getText());
});
如果我不手動設置,則不會觸發getEditor().setText();
即使我更改comboBox的值,這對我來說還是有點奇怪,因為我認為此textField可以保存comboBox的文本。(也許我錯了嗎?)。 每次刪除空白行時,都會顯示mouseClick事件。 如果getEditor().setText();
編輯器的getText()返回正確的文本行,但不會顯示在comboBox中。
問題:
我認為也許我在某個地方犯了一個錯誤,所以這就是為什么它不起作用,但是我不知道該怎么辦,您能幫我嗎?
在鏈接的代碼中
更換:
items.set(0, new ComboBoxNode(newDate, DATE_TYPE));
與:
items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));
鏈接的代碼僅更改零位置的日期。 在此新代碼中,適當位置的日期已更改。
完整代碼:
import java.time.LocalDate;
import java.time.Month;
import java.util.Objects;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.controlsfx.control.PopOver;
/**
*
* @author blj0011
*/
public class JavaFXApplication155 extends Application
{
private static final String DATE_TYPE = "DATE";
private class ComboBoxNode {
private final Object value;
private final String type;
private ComboBoxNode(final Object value, final String type) {
this.value = value;
this.type = type;
}
@Override
public String toString() {
return Objects.toString(value);
}
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
final ObservableList<ComboBoxNode> items =
FXCollections.observableArrayList(
new ComboBoxNode(LocalDate.now(), DATE_TYPE),
new ComboBoxNode(LocalDate.of(2017, Month.APRIL, 15), DATE_TYPE),//Added new date to ComboBox
new ComboBoxNode("11:35AM", "TIME"));
final PopOver datePopOver = new PopOver();
datePopOver.setTitle("Enter new date");
datePopOver.setCornerRadius(10);
datePopOver.setHeaderAlwaysVisible(true);
//datePopOver.set(true);
datePopOver.setAutoHide(true);
final ComboBox<ComboBoxNode> customComboBox = new ComboBox<>(items);
customComboBox.getSelectionModel().selectedItemProperty().addListener((o, old, newNode) -> {
if (newNode != null) {
if (newNode.type.equals(DATE_TYPE)) {
final DatePicker datePicker = new DatePicker((LocalDate) newNode.value);
datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));//Fixed this line of code
datePopOver.hide();
});
final StackPane stackPane = new StackPane(datePicker);
stackPane.setPadding(new Insets(10, 10, 10, 10));
datePopOver.setContentNode(stackPane);
datePopOver.show(customComboBox);
} else {
datePopOver.hide();
}
}
});
final FlowPane pane = new FlowPane(customComboBox);
pane.setPadding(new Insets(10, 10, 10, 10));
pane.setPrefWidth(400);
pane.setPrefHeight(300);
// Show Scene
final Scene scene = new Scene(pane);
primaryStage.setTitle("Popup calendar");
primaryStage.setScene(scene);
primaryStage.show();
}
}
關於您的問題:comboBox的文本存儲在哪里? 通常,JavaFX控件基於MVC架構,其中數據存儲在模型中。 控件僅根據定義的轉換器表示模型數據,並對模型的任何更改自動做出反應。
因此,在您的情況下,數據存儲在ObservableList items
。 要更新組合框,您只需要用新對象替換相應的項目即可。
注意,組合框已經在監聽ObservableList
並且任何添加/刪除/設置都將自動在UI端表示。
為什么此代碼不起作用:
newValue.setValue(newDate);
因為您更改了項目的內部狀態,並且ObservableList items
對這種更改不起作用。 僅列表的更改將起作用。 @Sedrick提出了正確的解決方案。
另請參閱相關問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.