如何重置JavaFX组合框值并重新显示提示文本

如何重置JavaFX组合框值并重新显示提示文本,java,javafx,Java,Javafx,基本上,我想要的就是有一个“清除”按钮,当按下该按钮时,清除一些文本字段和组合框的值,并使它们再次显示提示文本。文本字段工作正常,但组合框仅在第一次显示其提示文本,一旦我清除,它就不会再次显示 我在那里发现了一个类似的问题,但答案是重置选择并将值设置为null,下面是控制器类的一个最小可复制示例: package sample; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initia

基本上,我想要的就是有一个“清除”按钮,当按下该按钮时,清除一些文本字段和组合框的值,并使它们再次显示提示文本。文本字段工作正常,但组合框仅在第一次显示其提示文本,一旦我清除,它就不会再次显示

我在那里发现了一个类似的问题,但答案是重置选择并将值设置为null,下面是控制器类的一个最小可复制示例:

package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable{

    @FXML ComboBox<String> testBox;
    
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        testBox.getItems().addAll("Item 1", "Item 2");
    }

    public void clear(ActionEvent event) {
        testBox.getSelectionModel().clearSelection();
        testBox.setValue(null);
    }
}
包装样品;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.control.ComboBox;
导入java.net.URL;
导入java.util.ResourceBundle;
公共类控制器实现可初始化{
@FXML组合框测试盒;
@凌驾
公共void初始化(URL、ResourceBundle、ResourceBundle){
testBox.getItems().addAll(“第1项”、“第2项”);
}
公共无效清除(ActionEvent事件){
testBox.getSelectionModel().clearSelection();
setValue(null);
}
}
以及FXML文件:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <ComboBox fx:id="testBox" layoutX="225.0" layoutY="187.0" prefWidth="150.0" promptText="TEST" />
      <Button layoutX="274.0" layoutY="255.0" mnemonicParsing="false" onAction="#clear" text="Clear" />
   </children>
</AnchorPane>

这不起作用(提示文本不会再次显示),因此我在这里。

根据说明,如果提示文本不可编辑,则组合框不应显示提示文本。因此,它在开头显示提示文本的事实似乎是一个bug

如果要强制它在为空且不可编辑时显示提示文本,可以使用自定义按钮单元格:

public void initialize() {
    testBox.setButtonCell(new ListCell<>() {
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setText(testBox.getPromptText());
            } else {
                setText(item);
            }
        }
    });
    testBox.getItems().addAll("Item 1", "Item 2");
}
public void initialize(){
setButtonCell(新的ListCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(testBox.getPrompText());
}否则{
setText(项目);
}
}
});
testBox.getItems().addAll(“第1项”、“第2项”);
}

Post a。组合框有焦点吗?这可能会阻止它显示提示文本。@James_D Done。我希望这就是你需要我做的,如果可以的话再看一看。你能不能也发布FXML和应用程序类,这样我就不必从头开始编写它们了?@James_D我补充道,我在reddit上也发现了同样的问题,问题的原因是作者使用的是Java11,但它对使用Java的人来说运行良好8@James_D这确实不是我想要的,我需要用户只能从组合框中选择某些值,而不能输入自己的值。有什么办法吗?