Java 如何创建在一列中嵌入按钮的tableview?

Java 如何创建在一列中嵌入按钮的tableview?,java,javafx,Java,Javafx,我想在我的tablview单元格中嵌入一个按钮。到目前为止,我已经覆盖了表格单元格,并且可以在我的表格视图中反映一个按钮。但问题是,我希望在不同的列中显示不同的按钮名称。基本上,表中的数据是动态添加的。我尝试动态更改单元格工厂,但正如预期的那样,它反映了所有单元格都发生了变化。如有任何线索,我们将不胜感激 代码: import java.util.Random; 导入javafx.application.application; 导入javafx.beans.property.SimpleBol

我想在我的tablview单元格中嵌入一个按钮。到目前为止,我已经覆盖了表格单元格,并且可以在我的表格视图中反映一个按钮。但问题是,我希望在不同的列中显示不同的按钮名称。基本上,表中的数据是动态添加的。我尝试动态更改单元格工厂,但正如预期的那样,它反映了所有单元格都发生了变化。如有任何线索,我们将不胜感激

代码:

import java.util.Random;
导入javafx.application.application;
导入javafx.beans.property.SimpleBoleAnProperty;
导入javafx.beans.property.SimpleIntegerProperty;
导入javafx.beans.value.observeValue;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.chart.XYChart;
导入javafx.scene.control.Button;
导入javafx.scene.control.ContentDisplay;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.TextField;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.util.Callback;
/**
*@webhttp://java-buddy.blogspot.com/
*/
公共类JavaFXDynTable扩展应用程序{
private TableView TableView=new TableView();
私有按钮btnNew=新按钮(“新记录”);
静态随机=新随机();
公共静态int i=0;
私人行动;
静态最终字符串日期[]={
“星期一”,
“星期二”,
“星期三”,
“星期四”,
“星期五”};
公共静态类记录{
私有最终SimpleIntegerProperty id;
私有最终SimpleIntegerProperty值\u 0;
私有最终SimpleIntegerProperty值_1;
私有最终SimpleIntegerProperty值_2;
私有最终SimpleIntegerProperty值_3;
私有最终SimpleIntegerProperty值_4;
记录(int i、int v0、int v1、int v2、int v3、,
intv4){
this.id=新的SimpleIntegerProperty(i);
this.value_0=新的SimpleIntegerProperty(v0);
this.value_1=新的SimpleIntegerProperty(v1);
this.value_2=新的SimpleIntegerProperty(v2);
this.value_3=新的SimpleIntegerProperty(v3);
this.value_4=新的SimpleIntegerProperty(v4);
}
公共int getId(){
返回id.get();
}
公共无效集合ID(int v){
id.set(v);
}
public int getValue_0(){
返回值_0.get();
}
公共无效设置值_0(整数v){
值0.set(v);
}
public int getValue_1(){
返回值_1.get();
}
公共无效设置值_1(int v){
值_1.set(v);
}
public int getValue_2(){
返回值_2.get();
}
公共无效设置值_2(int v){
值_2.set(v);
}
public int getValue_3(){
返回值_3.get();
}
公共无效设置值_3(int v){
值_3.set(v);
}
public int getValue_4(){
返回值_4.get();
}
公共无效设置值_4(int v){
值_4.设置(v);
}
};
ObservableList data=FXCollections.observableArrayList();
@凌驾
公共无效开始(阶段primaryStage){
setTitle(“java buddy.blogspot.com”);
tableView.setEditable(true);
回叫手机工厂=
新回调函数(){
@凌驾
公共TableCell调用(TableP列){
返回新的EditingCell();
}
};
Btnew.setOnAction(Btnewandler);
//初始表
//“id”的不可编辑列
TableColumn col_id=新的TableColumn(“id”);
tableView.getColumns().add(col_id);
col_id.setCellValueFactory(
新财产价值工厂(“id”);
//可编辑列

对于
ButtonCell
类中的(int i=0;i),您可以执行以下操作:

    ButtonCell(String text){
          cellButton = new Button();
        cellButton.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent t) {
                // do something when button clicked
                Record record = (Record) getTableRow().getItem();
                // do something dependent on record....
            }
        });
    }
    //Display button if the row is not empty
    @Override
    protected void updateItem(Boolean t, boolean empty) {
        super.updateItem(t, empty);
        if(!empty){
            final Record record = (Record)getTableRow().getItem();
            cellButton.setText("Do something with "+record.getId());
            setGraphic(cellButton);
        } else { // you must always do the following in cell subclasses:
            setGraphic(null);
        }
    }
然后
ButtonCell

private class ButtonCell extends TableCell<Record, Record> {


    private Button cellButton;

    ButtonCell(){
          cellButton = new Button();
        cellButton.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent t) {
                // do something when button clicked
                Record record = getItem();
                // do something with record....
            }
        });
    }

    //Display button if the row is not empty
    @Override
    protected void updateItem(Record record, boolean empty) {
        super.updateItem(record, empty);
        if(!empty){
            cellButton.setText("Something with "+record.getId());
            setGraphic(cellButton);
        } else {
            setGraphic(null);
        }
    }
}
private class ButtonCell扩展了TableCell{
私人按钮;
ButtonCell(){
cellButton=新按钮();
cellButton.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
//单击按钮时执行某些操作
Record=getItem();
//用唱片做点什么。。。。
}
});
}
//如果行不为空,则显示按钮
@凌驾
受保护的void updateItem(记录记录,布尔值为空){
super.updateItem(记录,空);
如果(!空){
cellButton.setText(“带有“+record.getId()的内容”);
设置图形(cellButton);
}否则{
设置图形(空);
}
}
}

@感谢詹姆斯的营救。
col_action = new TableColumn<>("Action");
        col_action.setCellValueFactory(
                new Callback<TableColumn.CellDataFeatures<Record, Record>, 
                ObservableValue<Record>>() {

            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Record, Record> p) {
                return new ReadOnlyObjectWrapper<Record>(p.getValue());
            }
        });



        col_action.setCellFactory(
                new Callback<TableColumn<Record, Record>, TableCell<Record, Record>>() {

            @Override
            public TableCell<Record, Record> call(TableColumn<Record, Record> p) {
                return new ButtonCell();
            }

        });
private class ButtonCell extends TableCell<Record, Record> {


    private Button cellButton;

    ButtonCell(){
          cellButton = new Button();
        cellButton.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent t) {
                // do something when button clicked
                Record record = getItem();
                // do something with record....
            }
        });
    }

    //Display button if the row is not empty
    @Override
    protected void updateItem(Record record, boolean empty) {
        super.updateItem(record, empty);
        if(!empty){
            cellButton.setText("Something with "+record.getId());
            setGraphic(cellButton);
        } else {
            setGraphic(null);
        }
    }
}