2012-06-25 3 views
4

가벼운 대화 상자로 노드를 표시하는 재사용 가능한 메서드를 구현하려고합니다. 배경이 흐려지면서 노드가 StackPane의 맨 위에 추가됩니다. 다음과 같은 두 가지 문제가 있습니다.키보드 포커스를 노드 내의 컨트롤로 어떻게 제한합니까?

1) 스택 창 배경 노드의 컨트롤에서 여전히 포커스를받을 수 있습니다.

2) 어떻게 최상위 노드에 포커스를 둡니까? 노드에 requestFocus 메서드가 있다는 것을 알고 있지만 노드에 중첩 된 컨트롤에이 메서드를 제공해야합니다. 이 방법은 재사용이 가능하기 때문에 컨트롤을 직접 참조 할 수는 없습니다.

(I은 기존의 구현을 발견하여 전체 문제를 회피 할 수있는 경우, 즉 가장 좋은 것입니다,하지만 난 아직 제 3의 해결책을 발견하지 않은 경우)

감사에 대한

답변

4

:
1) 3 개 대안 제안, A-
탭을 키 프레싱

dialogbox.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 

    @Override 
    public void handle(javafx.scene.input.KeyEvent event) { 
     if (event.getCode() == KeyCode.TAB) { 
      System.out.println("TAB pressed"); 
      event.consume(); // do nothing 
     } 
    } 
}); 
을 잡으려고 대화 상자 창에 키 이벤트 처리기를 추가

b- 마지막으로 추가 된 대화 상자 하위를 제외한 StackPane 메인의 모든 자식을 일시적으로 비활성화합니다.

// Assuming dialogbox is at last in the children list 
for(int i=0; i<mainPane.getChildren().size()-1; i++){ 
    // Disabling will propagate to sub children recursively 
    mainPane.getChildren().get(i).setDisable(true); 
} 

C- 같은 B 그러나 수동으로 node.setFocusTraversable(false) (스팟 킥)에 의해 컨트롤에 초점을 비활성화합니다. 물론 이것은 당신이 선택하지 않을 것입니다 .. 2) 대화 상자가 (생성자 또는 setter 메서드를 통해) 대화 상자가 표시된 후에 어떤 노드가 포커스를 가져야하는지 대화 상자에 지시하십시오.

// init dialogbox and show it then 
dialogbox.setFocusTo(node_in_dialogbox); 
+0

제안 해 주셔서 감사합니다. 내 경우에는 ** b **가 가장 잘 작동하는 것 같습니다. (2)를 위해, 나는 빌더 패턴을 사용하여 당신이 제안하는 것을 할 수 있다고 생각한다. 이상적으로는 Swing의 KeyboardFocusManager와 같은 것을 기대하고 있었지만, 지금 당장 필요한 것을 얻을 수있는 유일한 방법 인 것 같아서 대답을 "correct"로 표시 할 것입니다. 감사! – zorgbargle

관련 문제