2015-01-07 3 views
0

Я хочу иметь TreeView, у которого все его дети постоянно расширены, и я не хочу, чтобы пользователь мог развернуть или свернуть любой из дети.JavaFX TreeView: удалить кнопку расширения/свернуть (узел раскрытия) и функциональность

Для этого я обнаружил, что мне нужно сделать следующее:

Даже если значок больше не виден, он по-прежнему доступен для клика. Я не вижу никакого способа фильтрации этого; Я вижу только способы ответить на него после этого факта.

Кроме того, если мне не хватает чего-либо еще, что мне нужно сделать для обеспечения этой функциональности, сообщите мне.

+0

ли элементы дерева имеют никакой функциональности вообще (то есть они могут быть нажаты, с некоторыми пользовательскими действиями)? –

+0

Да; Я внедрил собственный TreeCell и установил его как фабрику ячеек. Я не заинтересован в возможности запуска/отмены/фиксации изменений, так как мой график для каждого TreeCell представляет собой FlowPane с различными ComboBox и другими элементами управления для различных базовых моделей, которые отображаются в ячейках. Я все еще хочу, чтобы они могли щелкнуть, выделить и перетащить. – Nathan

+0

Возможно ли каким-либо образом удалить весь этап нажатия кнопки слияния с помощью CSS? Я бы даже согласился с этим в этот момент ... – Nathan

ответ

4

Я чувствую себя довольно глупо. Я думаю, что это было главным образом вопросом не зная, что называется этой стрелой штопа. По-видимому, это раскрытиеNode? Может быть, это общеизвестно.

В обычае определен TreeCell, все, что я сделал, добавьте эту строку в методе updateItem:

setDisclosureNode(null); 
+0

Привет .. было бы немного полезно, если вы объясните, как вы определяете собственный treeCell – theBeacon

1

Решение, позволяющее избежать изменения скина или поведения по умолчанию, является более простым, если мы отложаем клики перед их отправкой и потребляем правильные.

Для этого мы можем использовать EventDispatcher, процедить и мышь нажатой и щелкните правой кнопкой мыши по стрелкам, которые StackPane узлы:

class CellEventDispatcher implements EventDispatcher { 

    private final EventDispatcher original; 

    public CellEventDispatcher(EventDispatcher original) { 
     this.original = original; 
    } 

    @Override 
    public Event dispatchEvent(Event event, EventDispatchChain tail) { 
     if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED) || 
      event.getEventType().equals(ContextMenuEvent.ANY)){ 
      event.consume(); 
     } 
     if(event instanceof KeyEvent && event.getEventType().equals(KeyEvent.KEY_PRESSED)){ 
      if((((KeyEvent)event).getCode().equals(KeyCode.LEFT) || 
       ((KeyEvent)event).getCode().equals(KeyCode.RIGHT))){ 
       event.consume(); 
      } 
     } 
     return original.dispatchEvent(event, tail); 
    } 
} 

Теперь мы применяем наш пользовательский диспетчеру на дереве:

@Override 
public void start(Stage primaryStage) { 
    TreeView<String> tree = new TreeView<>(); 
    ... 
    EventDispatcher treeOriginal = tree.getEventDispatcher(); 
    tree.setEventDispatcher(new CellEventDispatcher(treeOriginal)); 

    Scene scene = new Scene(tree); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Это будет использовать любой щелчок (влево или вправо) по стрелкам на дереве.

EDIT

Добавлены в класс диспетчера событий в случае, когда пользователь использует клавиатуру для обхода древовидных, потребляя свернуть/развернуть события со стрелкой LEFT или RIGHT.

+0

Не создаст ли сценарий, где, если узел раскрытия (маленькая стрелка), где все еще есть (хотя, возможно, невидимый в моем случае), пользователь нажимает невидимую кнопку , и событие щелчка мыши будет потребляться без выбора TreeItem? – Nathan

+0

Ну, что вы могли бы сделать, это просто вызвать действие для этого treeItem (вам нужно будет найти, какой элемент был нажат, хотя) –

+0

Просто добавлен в класс диспетчера событий, когда пользователь использует клавиатуру для перемещения по древовидной структуре , потребляя события collapse/expand со стрелкой 'LEFT' или' RIGHT'. –

Смежные вопросы