当前位置: 首页 > 知识库问答 >
问题:

使SWT树列剪辑文本开头

谢善
2023-03-14

我有一个SWT树(通过JFace TreeViewer),它在列中显示项,其中一些列有长字符串。对于用户来说,字符串的结尾是有意义的位,而不是开始,所以当文本被剪裁时,我希望剪裁发生在字符串的开头,而不是结尾。示例:

|This is a very l...|
|... the tree column|

我用一个定制的PaintItem侦听器解决了这个问题,如下所述:http://www.eclipse.org/articles/article.php?file=article-customdrawingtableandtreeitems/index.html

提出了以下代码(不是很完美,里面有一些重复和神奇的数字):

    tree.addListener(SWT.EraseItem, new Listener()
    {
        public void handleEvent(Event event)
        {
            String text = ((TreeItem)event.item).getText(event.index);
            Point size = event.gc.textExtent(text);
            TreeColumn column = ((Tree)event.widget).getColumn(event.index);                
            int columnWidth = column.getWidth() - 10; /* magic number alert - the cells have some padding - must be a way of determining this... */ 
            if(size.x > columnWidth)
            {
                event.detail &= ~SWT.FOREGROUND;
            }
        }
    });

    tree.addListener(SWT.PaintItem, new Listener()
    {               
        @Override
        public void handleEvent(Event event)
        {   
            String text = ((TreeItem)event.item).getText(event.index);
            Point size = event.gc.textExtent(text);
            TreeColumn column = ((Tree)event.widget).getColumn(event.index);                
            int columnWidth = column.getWidth() - 10; /* magic number alert - the cells have some padding - must be a way of determining this... */ 
            if(size.x > columnWidth)
            {
                drawTextTail(event, text, columnWidth);
            }                               
        }

        private void drawTextTail(Event event, String text, int columnWidth)
        {
            String clippedText = "";
            int offset = text.length() - 1; 
            String nextClippedText = text.charAt(offset) + clippedText;
            while(fits(nextClippedText, columnWidth, event.gc))
            {
                clippedText = nextClippedText;
                offset--;
                nextClippedText = text.charAt(offset) + clippedText;
            }
            event.gc.drawText("..." + clippedText, 
                    event.x + 5, /* magic number alert - the cells have some padding - must be a way of determining this... */ 
                    event.y, false);
        }

        private boolean fits(String clippedText, int columnWidth, GC gc)
        {
            Point size = gc.textExtent("..." + clippedText);                        
            return size.x < columnWidth;
        }
    });

共有1个答案

翟卓君
2023-03-14

试试这个。第二列自动将字符串裁剪到该列中。

public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final Tree tree = new Tree(shell, SWT.NONE);
    tree.setLayout(new FillLayout());
    tree.setHeaderVisible(true);

    TreeColumn column = new TreeColumn(tree, SWT.NONE);
    column.pack();
    column.setWidth(100);

    TreeColumn column2 = new TreeColumn(tree, SWT.NONE);
    column2.pack();
    column2.setWidth(100);

    TreeItem item = new TreeItem(tree, SWT.NONE);
    item.setText(0, "Baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz");
    item.setText(1, "VERY VERY VERY VERY VERY VERY VERY VERY VERY VERY VERY long text");

    final TextLayout textLayout = new TextLayout(display);

    tree.addListener(SWT.PaintItem, new Listener() {
        public void handleEvent(Event event) {
            TreeItem item = (TreeItem) event.item;

            Point pt = new Point(event.x + 2, event.y + 2);

            for (int i = 0; i < tree.getColumnCount(); i++) {
                Rectangle rect = item.getBounds(i);

                String text = item.getText(i);

                if (rect.contains(pt)) {
                    String clippedText = "";
                    int offset = text.length() - 1; 
                    int columnWidth = tree.getColumn(i).getWidth();
                    String nextClippedText = text.charAt(offset) + clippedText;
                    while(fits(nextClippedText, columnWidth, event.gc) && offset >= 0)
                    {
                        clippedText = nextClippedText;
                        offset--;
                        if(offset >= 0)
                            nextClippedText = text.charAt(offset) + clippedText;
                    }

                    textLayout.setText(clippedText);

                    textLayout.draw(event.gc, event.x + 3, event.y + 3);
                }
            }
        }
    });
    tree.addListener(SWT.EraseItem, new Listener() {
        public void handleEvent(Event event) {
            /*
             * indicate that we'll be drawing the foreground in the
             * PaintItem listener
             */
            event.detail &= ~SWT.FOREGROUND;
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
}

private static boolean fits(String clippedText, int columnWidth, GC gc)
{
    Point size = gc.textExtent("..." + clippedText);                        
    return size.x < columnWidth;
}

它可能需要一些修复来真正显示...在裁剪的字符串前面,但这只是一个开始。

 类似资料:
  • 我遇到了一个棘手的问题。 在摆动环境中,有一个功能在AWT组件中可用文本区域。但是,这在 JFace 或 Swing 环境中都不存在。 有人想出解决办法吗?我必须自己制作界面吗? 提前谢谢

  • GNU nano是Unix系统下一款常用的文本编辑器,以简单易用著称。与之相比,功能更强大的Vi和Emacs编辑器,学习曲线比nano陡峭很多。由于nano对于一般的文本编辑来说已经足够,所以我想简单介绍一下,以便于更好入门。 基本使用 在Shell中输入下面命令,就可以启动nano: nano test.txt 命令nano后面跟着想要修改的文件名。如果当前文件夹下存在名为test.txt的文件

  • 1.1、什么是云剪辑 目睹云云剪辑,顾名思义就是云端处理视频的工具。他大大解放了生成工具的限制,可以随时随地的开启一段视频的剪辑工作。 目前对于视频制作有以下几个难点: 第一,相对图文模式,视频的制作门槛高。需要更专业、更具审美观的视频剪辑人员,花费更长的时间和精力来产出内容。 第二,市面上绝大部分视频制作软件操作复杂,生产内容效率低下,无法实现人工智能化。即使是非常资深的视频剪辑师,生产1分钟的

  • 我是SWT/JFace技术的新手,我发现了一个让我发疯的问题。在Eclipse RCP应用程序中,我有一个视图,其中放置了一个带有JFace TreeViewer的SWT树,该树通过标签提供程序提供标签和图标。根据客户要求,树的背景颜色为深蓝色,字体颜色为白色。当节点被选中时,这种颜色的组合导致节点文本的可视化效果不佳,文本不适合树区域,我们将鼠标指针放在节点上。不知何故出现了“本地高亮显示”。这

  • 问题内容: 我有这个HTML: 使用此CSS: 我正在应用的背景图像是200x100像素,但我只想显示200x50像素的背景图像的裁剪部分。 似乎不是正确的CSS属性。我该怎么用呢? 不应使用,因为我在Sprite上下文中使用了上述CSS,在该Sprite上下文中,我要显示的图像部分小于定义CSS的元素。 问题答案: 您可以将图形放置在具有其自身尺寸上下文的伪元素中: 浏览器支持很好,但是如果需要