通过选择行或选中框来选中SWT表复选框

时间:2016-03-30 16:17:08

标签: java eclipse-plugin swt

我想创建带有复选框的元素表,其中可以通过以下方式更改复选框的状态: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();
     }
}

但有了这个,我至少有两个问题:

1)当选择一行并点击checbox时,两个监听器将同时改变复选框的状态,所以最后没有效果(坏)。

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

那么如何解决这个问题或以另一种方式实现呢?

修改 我以这种方式使用多个按钮而不是表来解决我的问题

Button b = new Button(this, SWT.CHECK | SWT.WRAP);
b.setText("item");

但通过这一切,问题依然存在。

3 个答案:

答案 0 :(得分:3)

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

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

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() );
    }
  }
} );

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

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() );
    }
  }
} );

除了技术问题之外,我发现在使用键盘时处理至少是不寻常的和明显的烦人。确保此行为符合用户的实际期望。

答案 1 :(得分:0)

单击复选框时有效。它返回所有选定的行。

@Inject private AddSelectedItem addSelectedItem; //you can also create instance with new addSelectedItem()

...
table = new Table(shell, SWT.CHECK | SWT.BORDER);
table.addSelectionListener(addSelectedItem);
...

创建了类并实现了SelectionListener。

public class AddSelectedItem implements SelectionListener
{
    @Override
    public void widgetSelected(SelectionEvent event) 
    {
        ((/*TypeCast - Your Return Type - YourTypeClass*/) event.item.getData()).switchSelected();
    }
}

...

public class Test // YourTypeClass
{
    private int a,b;  // These are column variables at the table
    private boolean flag;
    public Test(){ //Constructor
     ...
     this.flag=false;
    }

    public void switchSelected() 
    {
        if (flag == false)
            flag = true;
        else
            flag = false;
    }

}

此外,实现arraylist并根据标志值将您的项目添加到列表中。如果选中它(flag == true),则添加到arraylist。然后你就可以到达你的arraylist中的每一个项目。

List<Test > list = new ArrayList<Test >();

总之,您应该使用选择标志定义类,然后根据标志值添加列表。然后,您可以打印列表(所选项目及其值)或将列表写入文件。

示例:

Selection    a      b
---------   ---    ---
checkBox     1      2
checkBox     2      3
..........   ..     ..

如果选中checkBox,则flag返回true。将其添加到列表中。

答案 2 :(得分:0)

  

通过选择行或选中框

来选中SWT表复选框

表格列可以添加已选中或未选中的图像

单击列检查到所有行都可以选中 和  未选中所有行的点击列可以取消选中

        TableColumn tblclmnNewColumn_1 = new TableColumn(table, SWT.LEFT);
        tblclmnNewColumn_1.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {

                System.out.println("Total Row Count:"+table.getItemCount());
                TableItem item[] = table.getItems();
                //get all the table items
                for(int i=0;i<table.getItemCount();i++)
                {
                    //Table_Column Checked or Not
                    if(item[i].getChecked())
                    {
                        //table items unchecked
                        item[i].setChecked(false);
                        tblclmnNewColumn_1.setImage(SWTResourceManager.getImage("D:\\Icon\\uncheck.png"));
                    }
                    else
                    {
                        //table items checked
                        item[i].setChecked(true);
                        tblclmnNewColumn_1.setImage(SWTResourceManager.getImage("D:\\Icon\\check.png"));
                    }
                }


            }
        });
        tblclmnNewColumn_1.setMoveable(true);
        tblclmnNewColumn_1.setToolTipText("All Check");
        tblclmnNewColumn_1.setImage(SWTResourceManager.getImage("D:\\Icon\\uncheck.png"));
        tblclmnNewColumn_1.setWidth(36);

完全描述访问此代码:: de)选择SWT表头中的所有“复选框: How can I put a "(de)select all" check box in an SWT Table header?