gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:58:59 44 4
gpt4 key购买 nike

我想创建带有复选框的元素表,其中可以通过以下方式更改复选框的状态: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)选中一行,点击checkbox时,两个监听器会同时改变checkbox的状态,所以最后没有效果(坏)。

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

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

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

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

但通过这一切,问题仍然悬而未决。

最佳答案

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

生成的选择监听器如下所示:

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

除了技术问题外,我发现使用键盘时的操作至少不正常且很烦人。确保此行为是您的用户实际期望的。

关于java - 通过选择行或选中复选框来选中 SWT 表复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36314342/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com