java - SWT/JFace TreeColumn 重新排序 - setMoveable() 问题

标签 java tree swt jface treeviewer

我正在尝试设置一个多列的 SWT Tree(通过 JFace TreeViewer),它允许用户通过拖动列标题。但是,第一列应保持固定且不可移动。我可以在每个 TreeColumn 上使用 setMoveable(true) 方法,但第一个真正接近的除外,但这不会阻止用户将不同的列拖动到它。有什么解决办法吗?

这是一个简化的工作片段(没有 JFace)来说明问题:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;

public class TreeTableColumnMove {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new RowLayout(SWT.HORIZONTAL));
        Tree tree = new Tree(shell, SWT.BORDER | SWT.CHECK);
        tree.setLayoutData(new RowData(-1, 100));
        tree.setHeaderVisible(true);
        for (int i = 0; i < 5; i++) {
            TreeColumn column = new TreeColumn(tree, SWT.CENTER);
            column.setText("Col " + i);
            column.setWidth(60);
            if (i > 0) column.setMoveable(true);
        }
        TreeItem item = new TreeItem(tree, SWT.NONE);
        item.setText(new String[] { "c0", "c1", "c2", "c3", "c4" });
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

最佳答案

这是我基于 danmec 的回答的最终解决方案:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;

    public class TreeTableColumnMove {

        public static void main(String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new RowLayout(SWT.HORIZONTAL));
            final Tree tree = new Tree(shell, SWT.BORDER | SWT.CHECK);
            tree.setLayoutData(new RowData(-1, 100));
            tree.setHeaderVisible(true);
            Listener moveListener = new Listener() {
                public void handleEvent(Event e) {
                    int[] order = tree.getColumnOrder();
                    for(int i=0, col=0; i<order.length; i++) {
                        int tmp = order[i];
                        order[i] = col;
                        col = tmp;
                        if(col == 0)
                            if(i == 0) return;
                            else break;
                    }
                    tree.setColumnOrder(order);
                }
            };

            for (int i = 0; i < 5; i++) {
                TreeColumn column = new TreeColumn(tree, SWT.CENTER);
                column.setText("Col " + i);
                column.setWidth(60);
                if (i == 0)                 
                    column.addListener(SWT.Move, moveListener);
                else
                    column.setMoveable(true);
            }
            TreeItem item = new TreeItem(tree, SWT.NONE);
            item.setText(new String[] { "c0", "c1", "c2", "c3", "c4" });
            shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            display.dispose();
        }
    }

关于java - SWT/JFace TreeColumn 重新排序 - setMoveable() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7442793/

相关文章:

algorithm - 嵌套循环解决方案的树遍历复杂度如何等于 O(n)

javascript - 在Javascript中通过id查找对象

java - 适用于网络的高性能pdf查看器

java - 想要创建一个 servlet,它将发布的数据保存到基于 guid 文件名的文件中

java - 单个 Apache 服务器可以同时处理 Tomcat 和 PHP 吗?

database - 在数据库中存储深层目录树

java - 从 SWT 浏览器销毁 Cookie

Java SWT - 将按钮添加到 shell

java - 如何访问 IContributionItem 的组合框

java - 替代已弃用的 setParameter(String name, Object val, Type type)