SWT 树的事件 SWT.CHECK

本文介绍了一种使用SWT库中的CHECK功能结合setGrayed方法实现多层次树状结构中节点选中状态管理的方法。通过递归算法确保父节点的状态正确反映其所有子节点的选中情况,包括未选中、全部选中及部分选中三种状态。

原来程序: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();
	}
}

 



 

 

package com.huawei.kdmpm.timeview; import com.huawei.common.util.SWTUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import java.util.ArrayList; import java.util.List; public class AiRecommendDialog extends Dialog { private Shell shell; private List<String> RecommendedSentences; private List<String> SelectSentences = new ArrayList<>(); private ScrolledComposite scrolledComposite; private Object result; public AiRecommendDialog(Shell parent, List<String> RecommendedSentences) { super(parent); this.RecommendedSentences = RecommendedSentences; } /** * Open the dialog. * * @return 返回结果 */ public Object open() { createContents(); shell.open(); shell.layout(); Display displayPED = getParent().getDisplay(); while (!shell.isDisposed()) { if (!displayPED.readAndDispatch()) { displayPED.sleep(); } } return result; } /** * Create contents of the dialog. */ private void createContents() { shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); shell.setText("动作单元语句AI推荐"); shell.setSize(806, 526); SWTUtil.inst().centerShell(shell); shell.setLayout(new GridLayout(1, false)); // 为shell设置布局 // 创建滚动容器 scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.BORDER); scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); // 创建滚动内容容器 Composite contentComposite = new Composite(scrolledComposite, SWT.NONE); // 为内容容器设置布局:垂直排列的GridLayout,一列 GridLayout contentLayout = new GridLayout(1, false); contentComposite.setLayout(contentLayout); scrolledComposite.setContent(contentComposite); // 创建标题行容器(在同一行放置标签和按钮) Composite headerComposite = new Composite(contentComposite, SWT.NONE); headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // 水平填充,垂直居中 GridLayout headerLayout = new GridLayout(2, false); // 2列,不等宽 headerLayout.marginWidth = 0; headerLayout.marginHeight = 0; headerComposite.setLayout(headerLayout); // 推荐语句标签 Label recommendationLabel = new Label(headerComposite, SWT.NONE); recommendationLabel.setText("推荐语句"); recommendationLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); // 全选按钮 final Button selectAllButton = new Button(headerComposite, SWT.CHECK); selectAllButton.setText("全选"); selectAllButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); // 复选框列表 final List<Button> checkBoxList = new ArrayList<>(); // 使用RecommendedSentences创建复选框 if (RecommendedSentences != null) { for (String sentence : RecommendedSentences) { Button checkBox = new Button(contentComposite, SWT.CHECK); checkBox.setText(sentence); checkBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); checkBoxList.add(checkBox); } } for (int i = 0; i < 25; i++) { Button checkBox = new Button(contentComposite, SWT.CHECK); checkBox.setText("选项" + (i + 1)); checkBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); checkBoxList.add(checkBox); } // 全选按钮事件 selectAllButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean isSelected = selectAllButton.getSelection(); for (Button checkBox : checkBoxList) { checkBox.setSelection(isSelected); } } }); // 复选框事件 for (Button checkBox : checkBoxList) { checkBox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean allSelected = true; for (Button cb : checkBoxList) { if (!cb.getSelection()) { allSelected = false; break; } } selectAllButton.setSelection(allSelected); } }); } // 设置内容容器的大小(计算所有控件的大小) contentComposite.pack(); // 设置滚动容器的最小大小 scrolledComposite.setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); } public List<String> SelectSentences() { return this.SelectSentences; } } "推荐语句"标签和"全选"按钮列间距离控制
最新发布
09-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值