2016-03-08 62 views
0

我有一個ChoiceBox我想要顯示下拉菜單,如果它在獲取焦點時通過輸入控件(焦點遍歷)循環播放。即我不希望用戶先按SPACE,因爲他必須做出選擇。我有以下代碼至今:JavaFX:在焦點時自動展開ChoiceBox

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鼠標事件「切換」是否顯示的項目。顯然,FocusedProperty首先會更改,顯示的項目,然後MouseEvents再次隱藏它們。

我該如何解決這個問題?

+0

爲什麼我得到這個問題的贊成票? –

+0

好吧,我添加了SSCCE,看到編輯問題 –

回答

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

+0

多數民衆贊成在偉大的!在此期間,我想出了一個類似的解決方案,但你的方式更清潔 –

+0

我意識到你的解決方案沒有完全工作,即當choiceBox已經集中(而不是顯示)。在這種情況下,ChangeListener不會觸發,因此無法使用鼠標進行擴展。但很容易添加相應的邏輯eventFilter(MOUSE_RELEASED) –

+0

很高興聽到你得到它爲你的情況工作。 「不顯示」是什麼意思?可見=假?我有興趣觀察這種行爲。 「不顯示」的 –