JavaFX:焦点时自动扩展ChoiceBox

时间:2016-03-08 13:59:21

标签: javafx-8

我有一个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再次隐藏它们。

我该如何解决这个问题?

1 个答案:

答案 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