`

SWT 树的事件 SWT.CHECK

阅读更多

原来程序: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
分享到:
评论

相关推荐

    SWT常用组件

    Button bt = new Button(shell, SWT.CHECK | SWT.BORDER | SWT.LEFT); // 多选、深陷、左对齐 ``` **Button组件的常用方法** - `setText(String string)`:设置按钮的文本内容。 - `setBounds(int x, int y, int ...

    Advanced SWT

    - `SWT.CHECK`:在第一列创建复选框。 - `SWT.FULL_SELECTION`:选择整个行而非单个单元格。 - `SWT.HIDE_SELECTION`:隐藏所选行的高亮效果。 除了基本样式外,还可以通过`setLinesVisible()`和`setHeaderVisible...

    swt 组件介绍

    CheckBox checkBox = new CheckBox(shell, SWT.CHECK); checkBox.setText("Remember me"); ``` 5. **Table**:用于显示表格数据。 - 创建方式: ```java Table table = new Table(shell, SWT.BORDER | SWT....

    SWT控件知识学习笔记

    Button check2 = new Button(shell, SWT.CHECK | SWT.BORDER); // 创建深陷型复选按钮 check2.setText("SWT.CHECK"); check2.setBounds(90, 50, 75, 30); // 启动应用 shell.open(); while (!shell.is...

    SWT疑难点解答,帮助新手朋友

    创建Button时,可以通过设置风格参数SWT.CHECK或SWT.RADIO来创建复选框和单选按钮。例如: ```java Button checkBox = new Button(parent, SWT.CHECK); checkBox.setText("复选框"); Button radioButton = new ...

    swt的相关知识记录 总结了许多的

    - **`SWT.CHECK`**:表示一个复选框按钮,用户可以选择或取消选择。 - **`SWT.RADIO`**:表示一个单选按钮,通常用于一组选项中,用户只能选择其中一个。 - **`SWT.TOGGLE`**:表示一个切换按钮,用户可以切换其状态...

    SWT例子文件

    如果上述地址打不开,可以参考以下具体操作步骤 Importing example source 1.Download and install the ... 8.Place a check beside org.eclipse.swt and click on the OK button. 9.Click on the Finish button.

    SWT-designer的用法

    - **Button**:提供用户交互,可以有多种类型,如 SWT.BORDER(带边框的按钮),SWT.CHECK(复选按钮),SWT.PUSH(普通按钮)和 SWT.RADIO(单选按钮)。 3. **Text 控件** - **Text**:允许用户输入文本,可以...

    SWT和JFACE学习笔记

    - **按钮**:`Button` 类支持多种类型的按钮,如普通按钮(`SWT.PUSH`)、单选按钮(`SWT.RADIO`)、复选按钮(`SWT.CHECK`)、箭头按钮(`SWT.ARROW`)和切换按钮(`SWT.TOGGLE`)。按钮的文本对齐可以通过样式设置...

    SWT界面编程知识汇总

    例如,`style`参数可以设置为`SWT.PUSH`、`SWT.RADIO`或`SWT.CHECK`等。 - **标签(Label)**:用于展示静态文本信息。`new Label(parent, style)`创建一个标签,`style`通常为0,表示默认样式。 - **文本框(Text...

    Eclipse_Swt_Jface_核心应用_部分19

    5.2.5 多选按钮(SWT.CHECK) 61 5.2.6 常用的方法 63 5.3 标签(Label) 64 5.3.1 文本标签 64 5.3.2 分割线标签 64 5.3.3 自定义标签(CLabel) 65 5.4 文本框(Text) 65 5.4.1 文本框的样式 66 ...

    flex-object-handles.zip_flex

    此外,还可以通过监听鼠标事件,比如`MouseEvent.MOUSE_DOWN`、` MouseEvent.MOUSE_UP` 和 `MouseEvent.MOUSE_MOVE`,实现拖放功能,让用户可以自由地在界面上移动对象。 2. **对象的编译**: Flex应用的编译过程...

    Eclipse3.4之SWT Designer的安装、注册及实践

    3. **填写注册信息**: 输入必要的个人信息,包括姓名、职位、组织等,并确保勾选“Automatically check for updates”和“Send me Instantiations product information and upgrades via email”。最后,确认...

    SWT(JFace) Menu、Bar...体验代码

    - `CHECK item`:复选框菜单项 - `SEPARATOR`:分隔线 - `RADIO item`:单选按钮菜单项 每个菜单项都有相应的事件监听器,处理用户的点击事件。 5. 图像和快捷键设置: ```java Image icon = new Image...

    树形复选框(Checkbox)

    在提供的`checktree`文件中,可能包含了HTML、CSS和JavaScript代码,通过这些代码我们可以深入了解如何实现这样一个树形复选框组件。对于开发者而言,理解并掌握这一技术可以帮助他们在项目中创建出更加直观、易用的...

    eclipse rcp check table

    3. **创建复选框列**:在`TableColumn`上使用`SWT.CHECK`风格,这会在每行的前面添加一个复选框。 4. **数据模型**:创建一个数据模型来存储`Person`对象,通常会使用`ArrayList`或者`ObservableList`,这样可以...

    SWT(JFace)体验之FillLayout布局

    最后,使用`shell.pack()`方法来调整Shell的大小以适应其内容,`shell.open()`显示窗口,然后进入事件循环,处理用户的交互。 在实际应用中,FillLayout经常用于工具栏、菜单栏或者需要子组件完全占据屏幕的场景,...

    关于Unhandled event loop exception No more handles的两种解决方案

    其背后的原因主要是由于某些图形操作或事件处理过程中出现了异常,而这些异常未能被妥善捕获和处理,从而导致了GUI线程无法继续执行。 #### 第一种解决方案:安装WindowBuilder插件 1. **启动Eclipse并访问Eclipse...

Global site tag (gtag.js) - Google Analytics