原来程序:Snippet274
用到SWT.CHECK这个的时候,通常还用到setGrayed,这两个一起组合在一起,一个Item就有了4种状态,但是图形中只能看出来3中。
所以在用到SWT.CHECK,还要完善。
Checked true Grayed false表示下面的子全部先上的;
Checked true Grayed true表示下面的子只有部分被选上。
因为我们只有三种情况:
Checked false Grayed false表示下面的子一个都【没有选上】;
Checked true Grayed false表示下面的子【全部先上】;
Checked true Grayed true表示下面的子只有【部分被选上】。
这样只要我们发现了Grayed true,就可以断定为【部分被选上】。
下面程序实现:
1,选中或弃选一个把它所有的子都选中或弃选,同时判断父是都没有选上、全部先上的或部分被选上。
2,子节点,只可能【没有选上】或【全部先上】
3,父节点,可能【没有选上】、【全部先上】和【部分被选上】。
4,看下面程序的时候就是,两个小递归还是,比较麻烦些。读程序是比较麻烦的事情,最主要的问题就是,不明白写程序人的思路,常常觉得读别人程序还不如自己去重写了,读程序常用的方法就是,Debug了,看变量的变化。我到觉得,不明白写程序的意图不好紧,应该去猜测意图,然后去看程序修正你的意图。猜测意图可以重程序想要完成的功能着手,如下面的Check,运行程序看看,有哪些变化,没有看不懂的程序,又有哪些变化。功能是这个程序做什么事情,意图这里我将之看成是实现功能完成的细节,程序只是意图的具体表现了。
public class Snippet274 {
static void checkParent(TreeItem parent, boolean checked, boolean grayed) {
if (parent == null)//递归退出条件:父亲为空。
return;
for(TreeItem child : parent.getItems()) {
if (child.getGrayed() || checked != child.getChecked()) {
//1,子节点有一个为【部分选中的】,直接设置父节点为【部分选中的】。
//2,子节点不完全相同,说明【部分选中的】。
checked = grayed = true;
break;
}
}
parent.setChecked(checked);
parent.setGrayed(grayed);
checkParent(parent.getParentItem(), checked, grayed);
}
static void checkChildren(TreeItem[] children, boolean checked) {
if(children.length == 0)//递归退出条件:孩子为空。
return;
for(TreeItem child : children) {
child.setGrayed(false);//必须设置这个,因为本来节点可能【部分选中的】。
child.setChecked(checked);
checkChildren(child.getItems(), checked);
}
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Tree tree = new Tree(shell, SWT.BORDER | SWT.CHECK);
tree.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.detail == SWT.CHECK) {
TreeItem item = (TreeItem) event.item;
boolean checked = item.getChecked();
checkChildren(item.getItems(), checked);
// 触发这个的Item的grayed = false,因为这是个CHECK事件,要么全选,要么全不选。
checkParent(item.getParentItem(), checked, false);
}
}
});
for (int i = 0; i < 4; i++) {
TreeItem itemI = new TreeItem(tree, SWT.NONE);
itemI.setText("Item " +i);
for (int j = 0; j < 4; j++) {
TreeItem itemJ = new TreeItem(itemI, SWT.NONE);
itemJ.setText("Item " + i + " " + j);
for (int k = 0; k < 4; k++) {
TreeItem itemk = new TreeItem(itemJ, SWT.NONE);
itemk.setText("Item " + i + " " + j + " " + itemk);
}
}
}
shell.setSize (200, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
- 大小: 4.2 KB
- 大小: 5.4 KB
分享到:
相关推荐
org.eclipse.swt.SWT.class org.eclipse.swt.SWTError.class org.eclipse.swt.SWTException.class org.eclipse.swt.accessibility.ACC.class org.eclipse.swt.accessibility.Accessible.class org.eclipse.swt....
org.eclipse.swt.cocoa.macosx.x86_64 org.eclipse.swt.gtk.linux.aarch64 org.eclipse.swt.gtk.linux.arm org.eclipse.swt.gtk.linux.ppc64le org.eclipse.swt.gtk.linux.s390 org.eclipse.swt.gtk.linux.s390x org...
swt.designer.pro.keygen.for.eclipse.3.rar SWT Designer的key获取器
org.eclipse.swt.win32.win32.x86_64-4.3.jar
org.eclipse.swt.gtk.linux.x86_3.7.0.dist.jar
服务器端用java代码通过html页面生成图片存储到本地。 三个需要用到的jar包:DJNativeSwing-SWT.jar、DJNativeSwing.jar、swt-win-x64.jar
SWT6.8破解文件 JAVA...SWT... 需要的就下吧~
swt.jar swt.jar swt.jar swt.jar swt.jar
org.eclipse.swt.win32.win32.x86_3.102.0.v20130605-1544.rar org.eclipse.swt.win32.win32.x86_3.102.0.v20130605-1544.rar
org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar 64位 org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar 64位
swt.designer.pro.keygen
这是应用在国产化服务器上的图形类库,可以是配在飞腾服务器以及麒麟服务器上面,可以进行很好地类库替换。直接将jar包替换掉x86上的jar包就可以了。
swt10.rarswt10.rarswt10.rarswt10.rarswt10.rarswt10.rar
swt2.rarswt2.rarswt2.rarswt2.rarswt2.rarswt2.rar
org.eclipse.swt.spy_1.0.1.jar
The.Definitive.Guide.to.SWT.and.JFace.eBook-LiB [SWT/JFace开发指南]
Manning.Swt.JFace.in.Action
64位windows操作系统使用的SWT库