2015-08-15 3 views
2

Код ниже - это методы экземпляра объекта.javafx: прикрепите ChoiceBox к TableCell на TableColumn во время редактирования

private StringProperty buySell; 

// getters 
public String getBuySell(){ 
    return this.buySell.get(); 
} 

// return Property Object 
public StringProperty buySellProperty(){ 
    return this.buySell; 
} 

// setters 
public void setBuySell(String buySell){ 
    this.buySell.set(buySell); 
} 

В моем Controller классе, я создал TableColumn для buySell строкового свойства с кодом ниже.

Когда я создал транзакцию, на tableView будет новая строка. Тем не менее, я хочу быть , способным редактировать таблицу buySellCell.

Вопрос: Как я могу встроить choicebox со значениями buy, sell в функции setOnEdit таким образом, что, когда я дважды щелкните на ячейке, это даст мне choicebox?

У меня есть код choicebox, но я понятия не имею, как объединить эти вещи вместе.

ChoiceBox<BuySell> buySellBox = new ChoiceBox<>(); 
    buySellBox.getItems().addAll("Buy", "Sell"); 

Update: проблема все еще не решена. Однако, следуя ответу в этом post, это то, что я получил до сих пор. После создания объекта создается строка таблицы, но когда я нажимаю на ячейку таблицы Buy на , редактирую, ничего не происходит (я ожидал, что появится окно выбора вниз, и позвольте мне выбрать мой выбор).

Моя таблица доступна для редактирования, так как я могу редактировать tableCell используя Volume с использованием приведенного выше кода.

Добавлен на изображения ниже, чтобы показать, что я могу редактировать tableCell Volume, но не таблицу tableClell , всякий раз, когда я нажимаю на нее.

enter image description here

+0

опубликовать полный код вашего класса контроллера. – Kachna

+0

Я думаю, что 'XXX.setOnEditCommit()' не нужно. – Kachna

+0

Извините, я хотел опубликовать весь класс контроллера, но здесь слишком длинный путь для публикации. Из-за ненужного, вы имеете в виду, я должен избавиться от него? – mynameisJEFF

ответ

2

Используйте мобильный завод, который создает в клетку ChoiceBox при редактировании. см. это answer.

Пример:

public class Main extends Application { 

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

     TableColumn<Item, String> col1 = new TableColumn("Column1"); 
     col1.setCellValueFactory(cellData -> cellData.getValue().nameProperty()); 
     col1.setCellFactory(column -> new TableCel_Edit()); 
     TableColumn<Item, Number> col2 = new TableColumn("Column2"); 
     col2.setCellValueFactory(cellData -> cellData.getValue().valueProperty()); 
     TableView<Item> table = new TableView(); 
     table.setEditable(true); 
     table.getItems().addAll(loadData()); 
     table.getColumns().addAll(col1, col2); 
     AnchorPane root = new AnchorPane(); 
     root.getChildren().add(table); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String... args) { 
     Application.launch(args); 
    } 

    private List<Item> loadData() { 
     List<Item> list = new ArrayList(); 
     for (int i = 0; i < 10; i++) { 
      Item item = new Item("item" + i, i); 
      list.add(item); 

     } 
     return list; 
    } 

    private class TableCel_Edit extends TableCell<Item, String> { 

     ChoiceBox<String> buySellBox = new ChoiceBox<>(); 

     public TableCel_Edit() { 
      buySellBox.getItems().addAll("Buy", "Sell"); 
      buySellBox.getSelectionModel().selectedIndexProperty().addListener((obs, oldValue, newValue) -> { 

       String value = buySellBox.getItems().get(newValue.intValue()); 
       processEdit(value); 
      }); 

     } 

     private void processEdit(String value) { 
      commitEdit(value); 
     } 

     @Override 
     public void cancelEdit() { 
      super.cancelEdit(); 
      setText(getItem()); 
      setGraphic(null); 
     } 

     @Override 
     public void commitEdit(String value) { 
      super.commitEdit(value); 
      // ((Item) this.getTableRow().getItem()).setName(value); 
      setGraphic(null); 
     } 

     @Override 
     public void startEdit() { 
      super.startEdit(); 
      String value = getItem(); 
      if (value != null) { 
       setGraphic(buySellBox); 
       setText(null); 
      } 
     } 

     @Override 
     protected void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item == null || empty) { 
       setText(null); 

      } else { 
       setText(item); 
      } 
     } 

    } 

} 

Update: в классе контроллера добавить следующее:

fxTransactionLogBuySell.setCellValueFactory(new PropertyValueFactory<Transaction,String>("buySell")); 
fxTransactionLogBuySell.setCellFactory(column -> new TableCel_Edit()); 

Вы также должны добавить этот класс (изменить Item к Transaction):

class TableCel_Edit extends TableCell<Item, String> { 
.... 
} 
+0

Я сделал именно то, что вы сделали выше, за исключением того, что я изменил имя 'TableCel_Edit' на' ChoiceBoxEdit' и нашел его под моим классом 'Controller'. Мне удалось скомпилировать код. Но когда я дважды щелкаю по ячейке, ничего не произошло. – mynameisJEFF

+0

не забывают сделать ваш стол доступным для редактирования. добавьте это: 'table.setEditable (true);' – Kachna

+0

редактируется, так как я могу редактировать другие столбцы, кроме столбца Buy/Sell, где я хочу редактировать с помощью ChoiceBox вместо ввода строки String – mynameisJEFF

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