2016-03-14 2 views
1

У меня есть таблица с флажком в каждой строке, и у меня есть кнопка действия. Моя проблема в том, что, как я могу получить выбранный флажок из таблицы, чтобы применить действие при нажатии кнопки?получить выбранные флажки из tableview

Это, как я добавить флажок в Tableview

public void addCeckBoxToTableView() { 
    /** define a simple boolean cell value for the action column so that the column will only be shown for non-empty rows. */ 
    tcCb.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Object, Boolean>, 
      ObservableValue<Boolean>>() { 
     @Override 
     public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Object, Boolean> p) { 
      return new SimpleBooleanProperty(p.getValue() != null); 
     } 
    }); 
    /** create a cell value factory with an add button for each row in the table. */ 
    tcCb.setCellFactory(new Callback<TableColumn<Object, Boolean>, TableCell<Object, Boolean>>() { 
     @Override 
     public TableCell<Object, Boolean> call(TableColumn<Object, Boolean> p) { 
      return new CheckBoxCell(); 
     } 
    }); 
} 

    private class CheckBoxCell extends TableCell<Object, Boolean> { 
    CheckBox checkBox = new CheckBox(); 
    HBox hb = new HBox(checkBox); 
    /** 
    * places button in the row only if the row is not empty. 
    */ 
    @Override 
    protected void updateItem(Boolean item, boolean empty) { 
     super.updateItem(item, empty); 
     if (!empty) { 
      setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
      setGraphic(hb); 
     } else { 
      setGraphic(null); 
     } 
    } 
} 

радушно.

+0

С этой настройкой вы не можете. Проблемы заключаются в следующем: 1. вы не устанавливаете значение логического свойства, когда флажок установлен/снят флажок, и 2. вы не храните ссылку на логическое свойство, предоставленное 'cellValueFactory'. Используйте стандартный ['CheckBoxTableCell'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/CheckBoxTableCell.html) и см. Http://stackoverflow.com/questions/28671132/или http://stackoverflow.com/questions/34940563 (или другие, просто поиск ...) –

ответ

0

Я того же мнения, как Джеймс: «с этой установки вы не можете»

Но вы могли бы сделать это таким образом

private TableView<Record> table; 
private TableColumn<Record, Boolean> tcCb; 
private Button actionButton; 

public class Record { 
    private SimpleBooleanProperty selected = new SimpleBooleanProperty(); 

    public SimpleBooleanProperty selectedProperty() { 
     return selected; 
    } 
} 

@Override 
public void start(Stage primaryStage) throws Exception { 
    table = new TableView<Record>(FXCollections.observableArrayList(new Record(), new Record(), new Record())); 
    table.setEditable(true); 
    // Create "CheckBox" - Column 
    tcCb = new TableColumn<Record, Boolean>("Boolean-Column"); 
    tcCb.setCellValueFactory(new PropertyValueFactory<Record, Boolean>("selected")); 
    tcCb.setCellFactory(CheckBoxTableCell.forTableColumn(tcCb)); 
    tcCb.setEditable(true); 
    table.getColumns().add(tcCb); 
    // Create actionButton for retrieving cellData 
    actionButton = new Button("action"); 
    actionButton.setOnAction(actionEvent -> { 
     for (int row = 0; row < table.getItems().size(); row++) { 
      System.out.println(tcCb.getCellData(row)); 
     } 
    }); 
    // The uninteresting stuff... 
    primaryStage.setScene(new Scene(new VBox(table, actionButton))); 
    primaryStage.show(); 
} 
0

Элементы пользовательского интерфейса должны связать их с объектом , В вашем примере вы хотите применить действие к выбранным элементам (Selected CheckBox).

Объект, связанный с таблицей может быть, как это

public class TableData{ 
private Boolean selected=Boolean.False; 
public void setSelected(Boolean isSelected){ 
this.isSelected = isSelected; 
} 

public boolean isSelected(){ 
return this.selected; 
} 
} 

Таким образом, в TableCell, Когда флажок установлен, обновление «выбранного» логическое значение TableData, путем добавления слушателя действия выбора в CheckBox ,

Затем вы можете выполнять итерацию через TableData, которую вы можете получить из TableView, чтобы применить действия при выборе Button.

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