2016-07-27 6 views
1

У меня есть ComboBox, который имеет следующую реализацию, как показано ниже в коде. Проблема, с которой я сталкиваюсь, заключается в том, что я могу только вызвать ChangeListener один раз для выбранного элемента. Я хотел бы запускать столько раз, сколько я нажимаю на один и тот же элемент.Событие выбора Trigger ComboBox для одного и того же элемента

int lastGridRowPos = 4; 
ObservableList<String> options = FXCollections.observableArrayList(
       "IdentityFile", 
       "LocalForward", 
       "RemoteForward", 
       "ForwardAgent", 
       "ForwardX11" 
     ); 

ComboBox propertyBox = new ComboBox(options); 
propertyBox.valueProperty().addListener(new ChangeListener<String>() { 
    @Override 
    public void changed(ObservableValue ov, String t, String t1) { 
     System.out.println("SELECTED=" + t1); 
     int rowCounter = getRowCount(grid); 
     grid.add(new Label(t1), 0, rowCounter + 1); 
     TextField field = newTextFieldWithIdPrompt(t1.toUpperCase(), ""); 
     grid.add(field, 1, rowCounter + 1); 
     propertyBox.getSelectionModel().clearSelection(); 
    } 
}); 

Я пытался очистить выбор, так что я могу нажать на тот же товар снова (в надежде, что выпадающий видит изменение позиции) с помощью propertyBox.getSelectionModel().clearSelection(); но не работает.

ответ

2

Я почти уверен, что более простое решение существует, но вы можете попробовать использовать setCellFactory и добавить EventFilter возвращенных ListCell Например:

propertyBox.setCellFactory(param -> { 
    final ListCell<String> cell = new ListCell<String>() { 
     @Override 
     public void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      if (!empty) 
       setText(item); 
     } 
    }; 
    cell.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     propertyBox.setValue(null); 
     propertyBox.getSelectionModel().select(cell.getItem()); 

     e.consume(); 
    }); 
    return cell; 
}); 

Эти ListCell s будет захватывать мышь нажимается события в списке предметов внутри ComboBox и потребляет эти события. Затем они вручную устанавливают valueProperty из ComboBox на нуль (для удаления выделения), затем он устанавливает это свойство в элемент, отображаемый ListCell.

Тогда в ChangeListener из valueProperty вам просто нужно проверить null с:

propertyBox.valueProperty().addListener((obs, oldVal, newVal) -> { 
    if (newVal != null) 
     System.out.println("Selected: " + newVal); 
}); 

Дополнительное примечание:

Я не знаю, ваш точный случай использования, но может быть Menu с MenuItem s - лучшее решение.

+0

Спасибо за решение (мне все равно придется попробовать его в моем случае). Теперь, когда вы это сказали, мне интересно, почему вместо этого меню не будет работать для меня. Я посмотрю меню. Все, что я хочу сделать, это предоставить список вещей, которые пользователь может выбрать, где ему разрешено выбирать один и тот же элемент снова и снова. – summerNight

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