JavaFX使用按钮将对象从一个tableview复制到另一个tableview

时间:2016-08-31 00:52:49

标签: button javafx tableview

所以我正在为桌面游戏构建一个warband计算器,目前它看起来像这样

enter image description here

我想做的是,当我点击“添加”按钮时,它将该单位/生物复制到右侧的桌面视图(所以,如果我点击Zombie行上的“添加”按钮,僵尸被复制到右边的tableview上。

问题是我只能选择行才能使其工作然后单击按钮,但我希​​望能够完全依赖按钮。我认为问题是我在按钮类中使用“getSelectionModel()。getSelectedItem()”来获取要复制的对象,但我找不到任何其他方法来执行此操作。

主类的相关代码部分

//Creates the lists

  ObservableList<Unit> rightSideList = FXCollections.observableArrayList();

  ObservableList<Unit> leftSideList = FXCollections.observableArrayList();

  // Puts some test data in the lists

  public Main() {

      rightSideList.add(new Unit("Skeleton",5,4,9,4,1,6,9));
      rightSideList.add(new Unit("Ghoul",6,4,010,4,1,6,7));
      rightSideList.add(new Unit("Zombie",4,5,1,3,1,6,5));
      rightSideList.add(new Unit("Wraith",4,5,19,3,1,6,5));
      rightSideList.add(new Unit("Spectre",4,5,1,3,1,6,5));

      leftSideList.add(new Unit("Skeleton",5,4,0,4,1,6,9));

  }
          //Creates the tables

      final TableView<Unit> table1 = new TableView<>(
            rightSideList

              );
      final TableView<Unit> table2 = new TableView<>(     
              leftSideList

  );          
//Defines the table columns

      //Columns for table 1

      TableColumn<Unit,String> unitNameCol = new TableColumn<>("Unit");
      unitNameCol.setCellValueFactory(new PropertyValueFactory("unitName"));
      unitNameCol.setMinWidth(100);
      TableColumn<Unit,Integer> speedCol = new TableColumn<>("Spd");
      speedCol.setCellValueFactory(new PropertyValueFactory("speed"));
      TableColumn<Unit,Integer> meleeCol = new TableColumn<>("Me");
      meleeCol.setCellValueFactory(new PropertyValueFactory("melee"));
      TableColumn<Unit,Integer> rangedCol = new TableColumn<>("Ra");
      rangedCol.setCellValueFactory(new PropertyValueFactory("ranged"));
      TableColumn<Unit,Integer> defenseCol = new TableColumn<>("Def");
      defenseCol.setCellValueFactory(new PropertyValueFactory("defense"));
      TableColumn<Unit,Integer> attackCol = new TableColumn<>("Att");
      attackCol.setCellValueFactory(new PropertyValueFactory("attack"));
      TableColumn<Unit,Integer> toughnessCol = new TableColumn<>("To");
      toughnessCol.setCellValueFactory(new PropertyValueFactory("toughness"));
      TableColumn<Unit,Integer> costCol = new TableColumn<>("Cost");
      costCol.setCellValueFactory(new PropertyValueFactory("cost"));
      TableColumn<Unit, Boolean> actionCol = new TableColumn<>("Action");
        actionCol.setSortable(false);
        actionCol.setMinWidth(35);

            // define a simple boolean cell value for the action column so that the column will only be shown for non-empty rows for table 1
        actionCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Unit, Boolean>, ObservableValue<Boolean>>() {
          @Override public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Unit, Boolean> features) {
            return new SimpleBooleanProperty(features.getValue() != null);
          }
        });

        // create a cell value factory with an add button for each row in the table for table 1
        actionCol.setCellFactory(new Callback<TableColumn<Unit, Boolean>, TableCell<Unit, Boolean>>() {
          @Override public TableCell<Unit, Boolean> call(TableColumn<Unit, Boolean> unitBooleanTableColumn) {
            return new AddUnitCell(mainStage, table1);
          }
        });

这是按钮类

/** A table cell containing a button for adding a unit */
  private class AddUnitCell extends TableCell<Unit, Boolean> {
    // a button for adding a new Unit.
    final Button addButton       = new Button("Add");
    // pads and centers the add button in the cell.
    final StackPane paddedButton = new StackPane();


    /**
     * AddUnitCell constructor
     * @param stage the stage in which the table is placed.
     * @param table the table to which a unit can be added.
     */
    AddUnitCell(final Stage stage, final TableView<Unit> table) {
      paddedButton.setPadding(new Insets(3));
      paddedButton.getChildren().add(addButton);

      addButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent actionEvent) {

            Unit selectedUnit = table.getSelectionModel().getSelectedItem();
            leftSideList.add(selectedUnit);
        }
      });
    }

    /** places an add 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(paddedButton);
      } else {
        setGraphic(null);
      }
    }
  }

如果您需要详细检查,请参阅项目存储库的链接

https://github.com/MagnusLindstrom88/Star-Struck-City-Warband-Calculator/blob/master/src/application/Main.java

2 个答案:

答案 0 :(得分:1)

而不是

Unit selectedUnit = table.getSelectionModel().getSelectedItem();

在按钮事件处理程序的handle()方法中,执行

Unit selectedUnit = table.getItems().get(getIndex());

答案 1 :(得分:1)

您应该从TableRow获取该项目,而不是依赖于选择模型来获取该项目:

Unit selectedUnit = (Unit) getTableRow().getItem();