我有一个ChoiceBox
我想要显示下拉菜单,如果它在通过输入控件(焦点遍历)循环时获得了焦点。即我不希望用户先按SPACE,因为他无论如何都必须做出选择。到目前为止,我有以下代码:
import java.util.Arrays;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SampleApp extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
GridPane pane = new GridPane();
ChoiceBox<String> box1 = new ChoiceBox<String>();
box1.getItems().addAll("1", "2", "3");
ChoiceBox<String> box2 = new ChoiceBox<String>();
box2.getItems().addAll("a", "b", "c");
for (ChoiceBox<String> choiceBox : Arrays.asList(box1, box2)) {
choiceBox.focusedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue && !oldValue) {
// transition from unfocused to focused -> expand choicebox
if (!choiceBox.isShowing()) {
choiceBox.show();
}
}
});
}
pane.add(box1, 0, 0);
pane.add(box2, 1, 0);
root.getChildren().add(pane);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
当我使用键盘进行焦点遍历时,此代码工作正常,但如果我用鼠标单击(未聚焦)ChoiceBox
,下拉列表会显示几毫秒,然后立即再次隐藏。我想ChoiceBox
有一个预定义的EventHandler
用于鼠标事件,其中&#34;切换&#34;是否显示项目。显然,FocusedProperty
首先更改,显示项目,然后MouseEvents
再次隐藏它们。
我该如何解决这个问题?
答案 0 :(得分:1)
使用MouseEvents的consume方法停止通过调度链进一步传播事件。
final ChangeListener<? super Boolean> showHideBox = ( __, ___, isFocused ) ->
{
if ( isFocused.booleanValue() )
{
choiceBox.show();
}
else
{
choiceBox.hide();
}
};
choiceBox.focusedProperty().addListener( showHideBox );
choiceBox.addEventFilter( MouseEvent.MOUSE_RELEASED, release ->
{
release.consume();
choiceBox.requestFocus();
} );
完整示例:https://gist.github.com/flasheater/0cc365227a235c3fb794。