java-swt之Tree及TreeColumn使用示例(treeitem的設定、編輯、刪除)
package studio32a.treecolumn.ui;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
public class Window {
private Shell shell;
private TreeColumn treeColumn_1;
/**
* Launch the application.
*
* @param args
*/
public static void main(String[] args) {
try {
Window window = new Window();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window.
*/
public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the window.
*/
protected void createContents() {
shell = new Shell(SWT.CLOSE);
shell.setSize(690, 481);
shell.setText("表格樹例程");
shell.setLayout(new FillLayout(SWT.HORIZONTAL));
windowToCenter(shell);
final Tree tree = new Tree(shell, SWT.BORDER | SWT.CHECK);
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
TreeColumn treeColumn = new TreeColumn(tree, SWT.CENTER);
treeColumn.setResizable(false);
treeColumn.setWidth(200);
treeColumn.setText("科目編碼");
treeColumn_1 = new TreeColumn(tree, SWT.LEFT);
treeColumn_1.setImage(null);
treeColumn_1.setWidth(100);
treeColumn_1.setText("科目名稱");
treeColumn = new TreeColumn(tree, SWT.LEFT);
treeColumn.setWidth(100);
treeColumn.setText("科目級別");
treeColumn = new TreeColumn(tree, SWT.CENTER);
treeColumn.setWidth(100);
treeColumn.setText("借貸方向");
TreeItem root1 = new TreeItem(tree, SWT.NONE);
root1.setText(new String[] { "1000", "貨幣資金", "1", "借" });
TreeItem root2 = new TreeItem(tree, SWT.NONE);
root2.setText(new String[] { "2000", "存貨", "1", "借" });
TreeItem root3 = new TreeItem(root2, SWT.NONE);
root3.setText(new String[] { "2100", "庫存商品", "2", "借" });
TreeItem root4 = new TreeItem(root3, SWT.NONE);
root4.setText(new String[] { "2110", "商品A", "3", "借" });
TreeItem root5 = new TreeItem(root4, SWT.NONE);
root5.setText(new String[] { "2111", "甲廠生產", "4", "借" });
TreeItem root6 = new TreeItem(root4, SWT.NONE);
root6.setText(new String[] { "2112", "乙廠生產", "4", "借" });
// 節點狀態判斷
// if(treeItem1.getExpanded()){do something}
tree.addMouseListener(new MouseAdapter() {
private TreeEditor treeEditor = new TreeEditor(tree);
@Override
public void mouseDown(MouseEvent e) {
Point p = new Point(e.x, e.y);
// 通過點選位置的y座標和第一列的任意x座標獲取當前行專案,其他列對應的item為null
final TreeItem item = getCurrentItem(tree, e.y);
if (item == null)
return;
Control old = treeEditor.getEditor();
if (old != null) {
old.dispose();
}
final int currentCol = getColId(tree, item, p);
final Text text = new Text(tree, SWT.RIGHT);
final Combo combo = new Combo(tree, SWT.READ_ONLY);
switch (currentCol) {
case 0:
case 1:
case 2:
text.setForeground(item.getForeground());
text.setText(item.getText(currentCol));
text.selectAll();
text.setFocus();
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
item.setText(currentCol, text.getText());
}
});
treeEditor.minimumWidth = item.getBounds(currentCol).width;
treeEditor.setEditor(text, item, currentCol);
break;
case 3:
combo.setForeground(item.getForeground());
combo.add("借");
combo.add("貸");
combo.setText(item.getText(currentCol));
combo.setFocus();
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
item.setText(currentCol, combo.getText());
}
});
treeEditor.minimumWidth = item.getBounds(currentCol).width;
treeEditor.setEditor(combo, item, currentCol);
break;
}
setChildrenCheck(item);
}
});
}
// 獲取當前列號的方法
private int getColId(Tree tree, TreeItem item, Point clickPoint) {
int column = -1;
for (int i = 0, n = tree.getColumnCount(); i < n; i++) {
Rectangle rect = item.getBounds(i);// 得到各列的邊界
if (rect.contains(clickPoint)) {
column = i;
break;
}
}
return column;
}
/**
* 根據點選位置獲取當前treeItem
*
* @param tree
* @param clickY
* 點選位置的y座標
* @return
*/
private TreeItem getCurrentItem(Tree tree, int clickY) {
TreeItem item = null;
int firstColWidth = tree.getColumn(0).getWidth();
for (int i = 0; i < firstColWidth; i++) {
item = tree.getItem(new Point(i, clickY));
if (item != null)
return item;
}
return item;
}
/**
* 子條目複選框跟隨父條目複選框狀態
*
* @param parent
*/
private void setChildrenCheck(TreeItem parent) {
// TreeItem的刪除
// if (parent.getChecked()) {
// parent.removeAll();
// parent.dispose();
// }
TreeItem[] children = parent.getItems();
if (parent.getChecked()) {
for (int i = 0; i < children.length; i++) {
children[i].setChecked(true);
setChildrenCheck(children[i]);
}
} else {
for (int i = 0; i < children.length; i++) {
children[i].setChecked(false);
setChildrenCheck(children[i]);
}
}
}
/**
* 視窗居中
* @param shell
*/
private void windowToCenter(Shell shell) {
int screenWidth = Display.getCurrent().getClientArea().width;
int screenHeight = Display.getCurrent().getClientArea().height;
int windowWidth = shell.getShell().getSize().x;
int windowHeight = shell.getShell().getSize().y;
shell.setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);
}
}