2016-10-25 2 views
0

JavaFX 2.2에서 JavaFX 8로 응용 프로그램을 이식 한 후에 편집 가능한 ComboBox의 캐럿이 누락되었습니다. 항목 선택시 ComboBox를 편집 가능으로 전환해야합니다. Windows 8.1에서 Oracle JDK 1.8 업데이트 102 및 업데이트 112를 사용하여 테스트했습니다.JavaFX 8 : 스위치 편집 가능한 ComboBox의 캐럿이 누락되었습니다.

ComboBox에서 포커스를 잃고 포커스를 되찾았을 때, 캐럿이 표시됩니다.

람다를 인터페이스 구현으로 변경하고 Platform.runLater을 제거한 후 실제로 JavaFX 2.2에서 작동합니다.

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.collections.FXCollections; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class TestEditableComboBox extends Application{ 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 

     ComboBox<String> comboBox = new ComboBox<String>(FXCollections.observableArrayList("item 1", 
                         "item 2", 
                         "editable")); 
     comboBox.setMinWidth(100D); 
     comboBox.setMaxWidth(100D); 
     comboBox.valueProperty().addListener((observable, 
              oldValue, 
              newValue) -> { 

     if (newValue != null){ 
      if ("editable".equals(newValue)){ 
       // JavaFX 2.2: comboBox.setEditable(true); 
       Platform.runLater(() -> comboBox.setEditable(true)); 
      } 
      else{ 
       // JavaFX 2.2: comboBox.setEditable(true); 
       Platform.runLater(() -> { 
        comboBox.setEditable(false); 
        comboBox.getSelectionModel().select(newValue); 
       }); 
      } 
     } 
     }); 

     VBox vBox = new VBox(new Label("Broken caret"), 
          comboBox); 
     Scene scene = new Scene(vBox); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args){ 

     Application.launch(args); 
    } 
} 

사람이 주위를 작동 할 수있는 아이디어를 가지고 :

나는 테스트를위한 SSCCE을 포함? 아니면 이것이 JavaFX 8 회귀 버그입니까?

추신 : Platform.runLater이 없으면 ComboBox는 다른 수정이 진행되는 동안 모델이 수정되기 때문에 java.lang.IndexOutOfBoundsException을 발생시킵니다.

답변

0

이 문제의 해결 방법을 발견했습니다.

클래스 com.sun.javafx.scene.control.skin.ComboBoxPopupControl의 ComboBox의 내부 구현에는 이라는 특수 클래스가 있으며 javafx.scene.control.TextField까지 확장됩니다. ComboBox::getEditor을 호출 할 때이 클래스의 인스턴스가 반환됩니다.

놀랍게도 FakeFocusTextField 클래스에는 텍스트 필드에 초점을 맞추는 setFakeFocus이라는 공용 메서드가 있습니다. 이 클래스의 requestFocus 메서드는 해당 부모에게 포커스를 제공합니다. 불행하게도이 해결 방법은 자바 FX 8 API의 외부 자바 FX 클래스를 사용

Platform.runLater(() -> comboBox.setEditable(true)); 

Platform.runLater(() -> { 
    comboBox.setEditable(true); 
    if (this.getEditor() instanceof FakeFocusTextField){ 
     ((FakeFocusTextField) this.getEditor()).setFakeFocus(true); 
    } 
} 

에 :

해결 방법은에서 콤보 상자의 편집을 설정하는 코드의 라인을 변경하는 것입니다. 구현이 변경되면 (Java 9와 같은) 향후 릴리스에서 작동하지 않을 수도 있습니다.

관련 문제