java-swt之Tree及TreeColumn使用示例(treeitem的设置、编辑、删除)

本文介绍了一个使用Eclipse SWT实现的表格树组件示例,详细展示了如何创建可编辑的Tree控件,并实现了当修改某一节点时,其子节点的状态随之更新的功能。此外,还介绍了如何通过鼠标点击事件定位到当前TreeItem并进行编辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值