java - 如何更改 CTabItem 下划线的颜色?

标签 java swt

我想更改 Activity CTabItem 下划线的颜色。该线是黑色的,我想要其他颜色,请参见下图。

enter image description here

最佳答案

我同意@greg-449的观点,通常你不应该搞乱CTabFolderRenderer,但在某些情况下你必须这样做。幸运的是,您不必重新编写整个渲染器。这是原始 SWT 渲染器中绘制线条的代码:

            // draw a Focus rectangle
            if (parent.isFocusControl()) {
                Display display = parent.getDisplay();
                if (parent.simple || parent.single) {
                    gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
                    gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
                    gc.drawFocus(xDraw-1, textY-1, extent.x+2, extent.y+2);
                } else {
                    gc.setForeground(display.getSystemColor(BUTTON_BORDER));
                    gc.drawLine(xDraw, textY+extent.y+1, xDraw+extent.x+1, textY+extent.y+1);
                }
            }

这里有趣的部分是gc.drawLine(...)。您可以让原始渲染器绘制所有内容,然后您可以在其上绘制您自己的具有不同颜色的线条。

我刚刚重新计算了参数。我确实做了一些改动,当文本使用省略号时这将不起作用,但它可能是一个很好的起点。

注意:此代码可能会在下一版本的 SWT 中崩溃。每次更新 SWT 时都必须更新它。

这是一个片段,其中项目具有不同的颜色:

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

    final int tabFolderStyle = SWT.NONE;
    final CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
    tabFolder.setSimple(false);
    final CTabItem tabItem1 = new CTabItem(tabFolder, SWT.NONE);
    tabItem1.setText("Tab1");
    tabItem1.setData("color", display.getSystemColor(SWT.COLOR_CYAN));
    final CTabItem tabItem2 = new CTabItem(tabFolder, SWT.NONE);
    tabItem2.setText("Tab2");
    tabItem2.setData("color", display.getSystemColor(SWT.COLOR_YELLOW));


    tabFolder.setRenderer(new org.eclipse.swt.custom.CTabFolderRenderer(tabFolder){
        protected void draw (int part, int state, Rectangle bounds, GC gc) {
            super.draw(part, state, bounds, gc);
            if (part >= 0 && part == tabFolder.getSelectionIndex()) {
                int itemIndex = part;
                CTabItem item = parent.getItem(itemIndex);
                int x = bounds.x;
                int y = bounds.y;
                int height = bounds.height;
                int width = bounds.width;
                boolean onBottom = (tabFolderStyle & SWT.BOTTOM) != 0;

                Point extent = gc.textExtent(item.getText(), SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);
                int textY = y + (height - extent.y) / 2;
                textY += onBottom ? -1 : 1;


                Rectangle trim = computeTrim(itemIndex, SWT.NONE, 0, 0, 0, 0);
                int xDraw = x - trim.x;

                gc.setForeground((Color) item.getData("color"));
                gc.drawLine(xDraw, textY+extent.y+1, xDraw+extent.x+1, textY+extent.y+1);
            }
        }
    });

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

enter image description here

关于java - 如何更改 CTabItem 下划线的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822271/

相关文章:

java - 如何将 TreeViewer 单元格的一部分设为粗体?

java - Linux 版本的 Eclipse 在尝试打开二进制文件(扩展名为 .bin)时卡住

java - JPA 1 不够好

java - 得到错误的输出

java - ImageIcon 的 2D 数组在 JPanel 中显示不一致且仅部分显示

java - Eclipse - 无法在 64 位 JVM 上加载 32 位 SWT 库

java - SWT获取光标位置

java - 对于 JAVA SWT 中禁用的控件,工具提示不可见

java - 如何检查文件是否已存在于 Dropbox 中

java - Java多线程如何让线程等待一段时间