SWT Table 复选框通过选择行或选中该框

Asa*_*ura 3 java swt eclipse-plugin

我想创建带有复选框的元素表,其中可以通过以下方式更改复选框的状态:1)单击复选框,2)单击行。不间断且快速。

我试过了:

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;

public class Example {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setSize(280, 300);
        shell.setText("FooTable");

        Table table = new Table(shell, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL| SWT.H_SCROLL);

        String[] titles = { "Column" };

        for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
            TableColumn column = new TableColumn(table, SWT.NULL);
            column.setText(titles[loopIndex]);
        }

        for (int loopIndex = 0; loopIndex < 5; loopIndex++) {
            TableItem item = new TableItem(table, SWT.NULL);
            item.setText("Item " + loopIndex);
        }

        for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
            table.getColumn(loopIndex).pack();
        }

        table.setBounds(25, 25, 220, 200);

        table.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (event.detail == SWT.CHECK) {
                    System.out.println("You checked " + event.item);
                } 
                else {
                    System.out.println("You selected " + event.item);
                    TableItem ti  = (TableItem)event.item;
                    ti.setChecked(!ti.getChecked());
                }
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                    display.sleep();
        }
        display.dispose();
     }
}
Run Code Online (Sandbox Code Playgroud)

但这样我至少有两个问题:

1)当选择一行并单击复选框时,两个监听器将同时更改复选框的状态,因此最终没有效果(不好)。

2)当我双击一行时,再次不会有任何效果(坏),但是当我双击复选框(未选择行)时,我可以清楚地看到复选框改变其状态两次(好) 。

那么我该如何解决这个问题或以其他方式实现它呢?

编辑 我通过使用多个按钮而不是表格解决了我的问题,以这种方式

Button b = new Button(this, SWT.CHECK | SWT.WRAP);
b.setText("item");
Run Code Online (Sandbox Code Playgroud)

但纵观这一切,问题仍然悬而未决。

Rüd*_*ann 6

为了解决您的第一个问题,您可以检查是否也选择了选中的项目,并在这种情况下恢复选中。

结果选择侦听器将如下所示:

table.addListener( SWT.Selection, new Listener() {
  public void handleEvent( Event event ) {
    if( event.detail == SWT.CHECK ) {
      System.out.println( "You checked " + event.item );
      if( table.indexOf( ( TableItem )event.item ) == table.getSelectionIndex() ) {
        TableItem ti = ( TableItem )event.item;
        ti.setChecked( !ti.getChecked() );
      }
    } else {
      System.out.println( "You selected " + event.item );
      TableItem ti = ( TableItem )event.item;
      ti.setChecked( !ti.getChecked() );
    }
  }
} );
Run Code Online (Sandbox Code Playgroud)

要解决双击问题,您可以添加一个默认选择侦听器,如果双击该项目(而不是复选框),该侦听器会更改复选标记

table.addListener( SWT.DefaultSelection, new Listener() {
  @Override
  public void handleEvent( Event event ) {
    if( event.detail == SWT.NONE ) {
      TableItem ti = ( TableItem )event.item;
      ti.setChecked( !ti.getChecked() );
    }
  }
} );
Run Code Online (Sandbox Code Playgroud)

除了技术问题之外,我发现使用键盘时的处理方式至少不寻常且令人讨厌。确保此行为是您的用户真正期望的。