Java 单击表格中某个单元格时如何更改该单元格的内容

Java 单击表格中某个单元格时如何更改该单元格的内容,java,eclipse,swt,windowbuilder,Java,Eclipse,Swt,Windowbuilder,我有一张关于JavaSWT的表格。我有一个“已付款”列,所有项目都写有“未付款”和一个“未付款”图标。这是表格的第四列 我已经用虚拟内容填充了表,现在,我想在第四列“payed”的单元格上添加一个侦听器,以更改单击单元格的内容。如果单元格有未付款的文本和图标,则必须更改为付款的文本和图标,以及相反的行为 我找不到实现这一点的方法,因为我无法将选择侦听器添加到表的单元格中,或者我不知道如何做到这一点 这是我的源代码: Table membersTable = new Table(clubCompo

我有一张关于JavaSWT的表格。我有一个“已付款”列,所有项目都写有“未付款”和一个“未付款”图标。这是表格的第四列

我已经用虚拟内容填充了表,现在,我想在第四列“payed”的单元格上添加一个侦听器,以更改单击单元格的内容。如果单元格有未付款的文本和图标,则必须更改为付款的文本和图标,以及相反的行为

我找不到实现这一点的方法,因为我无法将选择侦听器添加到表的单元格中,或者我不知道如何做到这一点

这是我的源代码:

Table membersTable = new Table(clubComposite, SWT.BORDER | SWT.CHECK | SWT.FULL_SELECTION);
membersTable.setLinesVisible(true);
membersTable.setHeaderVisible(true);
membersTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

TableColumn tblclmnName = new TableColumn(membersTable, SWT.NONE);
tblclmnName.setWidth(150);
tblclmnName.setText("Nombre");

TableColumn tblclmnCommonPhoneNumber = new TableColumn(membersTable, SWT.NONE);
tblclmnCommonPhoneNumber.setWidth(120);
tblclmnCommonPhoneNumber.setText("Teléfono");

TableColumn tblclmnCommonMoney = new TableColumn(membersTable, SWT.NONE);
tblclmnCommonMoney.setWidth(150);
tblclmnCommonMoney.setText("Participación Habitual");

TableColumn tblclmnPayed = new TableColumn(membersTable, SWT.CENTER);
tblclmnPayed.setWidth(50);
tblclmnPayed.setText("Payed"); 

// populate Table
for (int i=0; i<50; i++) {
    TableItem tableItem = new TableItem(membersTable, SWT.CENTER);                  
    tableItem.setText(new String[] {"person "+i, "610610620", "100", "non payed"});
    tableItem.setImage(3, uncheckedImage);
}
Table membersTable=新表(clubComposite,SWT.BORDER | SWT.CHECK | SWT.FULL_SELECTION);
membersTable.setLinesVisible(true);
membersTable.setheadervible(true);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true,1,1));
TableColumn tblclmnName=新的TableColumn(membersTable,SWT.NONE);
tblclmnName.setWidth(150);
tblclmnName.setText(“Nombre”);
TableColumn tblclmnCommonPhoneNumber=新的TableColumn(membersTable,SWT.NONE);
tblclmnCommonPhoneNumber.setWidth(120);
tblclmnCommonPhoneNumber.setText(“电话号码”);
TableColumn TBLCLMNCommoney=新的TableColumn(membersTable,SWT.NONE);
TBLCLMNCommoney.setWidth(150);
tblclmncommoney.setText(“惯常参与”);
TableColumn tblclmnPayed=新的TableColumn(membersTable,SWT.CENTER);
tblclmnPayed.设置宽度(50);
tblclmnPayed.setText(“已付款”);
//填充表

对于(int i=0;i,因为您在创建
TableItem
for
循环中,所以您已经有了行的索引。同样,如果您需要实际的
TableItem
,您也已经有了访问该行的权限

for (int i=0; i<50; i++) {
    TableItem tableItem = new TableItem(membersTable, SWT.NONE);                    
    tableItem.setText(new String[] {"person "+i, "610610620", "100"});

    Button button = new Button(membersTable, SWT.CHECK);
    button.pack();
    TableEditor editor = new TableEditor(membersTable);
    editor.minimumWidth = button.getSize().x;
    editor.horizontalAlignment = SWT.CENTER;
    editor.setEditor(button, tableItem, 3);

    final int index = i; // Hold the row index here

    button.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            //how to know in which row is clicked the checkbox?
            System.out.println("Row selected: " + index);
            System.out.println("Participación Habitual: " + tableItem.getText(2));
        }
    });
}

由于您在创建
TableItem
for
-循环中,因此您已经拥有该行的索引。同样,如果您需要实际的
TableItem
,您也已经可以访问该行

for (int i=0; i<50; i++) {
    TableItem tableItem = new TableItem(membersTable, SWT.NONE);                    
    tableItem.setText(new String[] {"person "+i, "610610620", "100"});

    Button button = new Button(membersTable, SWT.CHECK);
    button.pack();
    TableEditor editor = new TableEditor(membersTable);
    editor.minimumWidth = button.getSize().x;
    editor.horizontalAlignment = SWT.CENTER;
    editor.setEditor(button, tableItem, 3);

    final int index = i; // Hold the row index here

    button.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            //how to know in which row is clicked the checkbox?
            System.out.println("Row selected: " + index);
            System.out.println("Participación Habitual: " + tableItem.getText(2));
        }
    });
}

为什么不使用第4列中的按钮来更改付款状态?(可能我理解错了用例)我认为这将涵盖您的情况,并且添加适当的侦听器更容易。@RafaelPalomino我如何使用按钮来实现这一点?我可以设置复选框而不是按钮吗?这会更好地满足我的需要。您可以使用复选框和侦听器共享示例代码吗?谢谢OK@RafaelPalomino我成功地添加了一个复选框样式的按钮,现在我可以添加了一个监听器,但是我怎么知道在哪一行中单击了复选框?为什么不在第四列中使用按钮来更改付款状态?(可能我误解了用例)我认为这将涵盖您的情况,并且添加适当的侦听器更容易。@RafaelPalomino我如何使用按钮来实现这一点?我可以设置复选框而不是按钮吗?这会更好地满足我的需要。您可以使用复选框和侦听器共享示例代码吗?谢谢OK@RafaelPalomino我成功地添加了一个复选框样式的按钮,现在我可以添加了一个侦听器,但我如何知道在哪一行中单击了复选框?如何获取实际的TableItem?@NullPointerException在
for
-循环开头创建的
TableItem
已经可以从
widgetSelected
中访问。更新了我的答案,以显示访问项并获取表中值的示例第3列,如您的问题所示。还有另一种方法可以知道用户按下了哪个按钮?我这样问是因为删除行的情况很常见,所以您使用的索引可能不正确。我尝试了“membersTable.getSelectionIndex();”在widgetSelected事件上,但它返回-1,因为当您按下按钮时,您没有按入行,即使在这种情况下,
index
不可靠,使用
tableItem
将是。如果您需要该项的数字索引,可以从侦听器内部使用该方法。将更新我的答案。@NullPointerException不客气-很高兴我能帮忙!如何获取实际的TableItem?@NullPointerException在
for
-循环开头创建的
TableItem
已经可以从
widgetSelected
中访问。更新了我的答案,在第3列a中显示了访问项并获取值的示例这是您的问题。还有另一种方法可以知道用户按下了哪个按钮?我这样问是因为删除行的情况很常见,所以您使用的索引可能不正确。我尝试了“membersTable.getSelectionIndex();”在widgetSelected事件上,但它返回-1,因为当您按下按钮时,您没有按入行,即使在这种情况下,
index
不可靠,使用
tableItem
将是。如果您需要该项的数字索引,可以从侦听器内部使用该方法。将更新我的答案。@Nul不客气-很高兴我能帮上忙!
@Override
public void widgetSelected(SelectionEvent e) {
    //how to know in which row is clicked the checkbox?
    System.out.println("Row selected: " + membersTable.indexOf(tableItem));
    System.out.println("Participación Habitual: " + tableItem.getText(2));
}