java - 如何使用 swt.TabItem 添加关闭按钮?

标签 java swt tabitem

TabFolder tabFolder = new TabFolder(composite, SWT.CLOSE);      

TabItem tab1 = new TabItem(tabFolder, SWT.CLOSE);
tab1.setText("Tab 1");

TabItem tab2 = new TabItem(tabFolder, SWT.CLOSE);
tab2.setText("Tab 2");

我有一个 swt.TabFolder,上面有一些 swt.TabItems。 我想为这些 TabItems 设置一个关闭按钮,这样我就可以在运行时关闭我想要的选项卡。 而且我不想使用 CTabFolder 或 CTabItem

谁能告诉我我能为此做什么?

public DomainUI(Composite composite, TabFolder newTabFolder, boolean comingFromSelf)
    {       
        boolean itemsDisposed = false;
        TabItem[] itemsOnTabFolder = newTabFolder.getItems();
        String[] namesOfItemsOnTabFolder = new String[itemsOnTabFolder.length];
        if(comingFromSelf) // checking when to dispose other tabs
        {
            if(itemsOnTabFolder.length != 0)
            {
                for(int i=0; i<itemsOnTabFolder.length; i++)
                {
                    namesOfItemsOnTabFolder[i] = itemsOnTabFolder[i].getText();
                    itemsOnTabFolder[i].dispose();
                }
                itemsDisposed = true;
            }
        }
        final Composite compositeInTab = new Composite(newTabFolder, SWT.NONE);
        compositeInTab.setLayout(null);

        // CREATIION OF LABELS AND TEXTFIELDS
        systemCodeLabel = new Label(compositeInTab, 0);
        systemCodeText = new Text(compositeInTab, SWT.BORDER);

        domainNameLabel = new Label(compositeInTab, 0);
        domainNameText = new Text(compositeInTab, SWT.BORDER);

        organizationalUnitLabel = new Label(compositeInTab, 0);
        organizationalUnitText = new Text(compositeInTab, SWT.BORDER);

        organizationNameLabel = new Label(compositeInTab, 0);
        organizationNameText = new Text(compositeInTab, SWT.BORDER);

        systemCodeLabel.setText("System Code");
        domainNameLabel.setText("Domain Name");
        organizationalUnitLabel.setText("Organizational Unit");
        organizationNameLabel.setText("Organization Name");
newTabFolder.addMouseListener(new MouseAdapter() 
        {
            public void mouseUp(MouseEvent arg0)
            {
                TabFolder curFolder = (TabFolder)arg0.widget;
                Point eventLocation = new Point(arg0.x, arg0.y);
                TabItem item = curFolder.getItem(eventLocation);
                if(item == null)
                    return;

                Image image = item.getImage();

                // check if click is on image
                if(        eventLocation.x >= item.getBounds().x + image.getBounds().x && eventLocation.x <= item.getBounds().x + image.getBounds().x + image.getBounds().width
                        && eventLocation.y >= item.getBounds().y + image.getBounds().y && eventLocation.y <= item.getBounds().y + image.getBounds().y + image.getBounds().height)
                {
                    System.out.println("Close tab");
                    item.dispose();
                }
                else
                {
                    System.out.println("Don't close tab");
                }
            }

        });
}

最佳答案

TabItem 没有此功能(它将忽略您使用的 SWT.CLOSE 样式)。除了使用 CTabItem 没有其他方法(我知道)而是使用样式 SWT.CLOSE。您还必须将 TabFolder 替换为 CTabFolder

参见 this页或 this一个很好的例子的页面。

或者,如果您不能离开TabItem,您可以使用item 向每个选项卡添加一个x 图像。 setImage(xImage); 并将 Listener 添加到文件夹,处理“关闭内容”。当然,x 项将位于左侧,而不是右侧...

设法让它工作。只需将 img/x.gif 替换为您的关闭图像(为了测试,您可以使用:display.getSystemImage(SWT.ICON_ERROR)):

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

    final TabFolder folder = new TabFolder(shell, SWT.NONE);

    TabItem item = new TabItem(folder, SWT.NONE);
    item.setImage(Images.loadImage("img/x.gif"));
    item.setText("Text");

    TabItem item2 = new TabItem(folder, SWT.NONE);
    item2.setImage(Images.loadImage("img/x.gif"));
    item2.setText("Text2");

    folder.addMouseListener(new MouseListener() {

        @Override
        public void mouseUp(MouseEvent arg0) {
            TabFolder curFolder = (TabFolder)arg0.widget;
            Point eventLocation = new Point(arg0.x, arg0.y);
            TabItem item = curFolder.getItem(eventLocation);
            if(item == null)
                return;

            Image image = item.getImage();

            // check if click is on image
            if(        eventLocation.x >= item.getBounds().x + image.getBounds().x && eventLocation.x <= item.getBounds().x + image.getBounds().x + image.getBounds().width
                    && eventLocation.y >= item.getBounds().y + image.getBounds().y && eventLocation.y <= item.getBounds().y + image.getBounds().y + image.getBounds().height)
            {
                System.out.println("Close tab");
                item.dispose();
            }
            else
            {
                System.out.println("Don't close tab");
            }
        }

        @Override
        public void mouseDown(MouseEvent arg0) {
        }

        @Override
        public void mouseDoubleClick(MouseEvent arg0) {
        }
    });

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

结果是这样的:

关闭前:

Before closing

关闭后:

After closing

关于java - 如何使用 swt.TabItem 添加关闭按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11844119/

相关文章:

c# - 将 WPF 中的选项卡内容分配给页面

java - 从 Window 应用程序访问露天文档

java - 互操作性 : Scala Case Classes + Java Pojos

java - Applet 中的 SWT FileDialog 不显示

wpf - 在 WPF 中以编程方式选择 tabItem

c# - 为什么我的 TabItem 自定义控件没有显示在 TabControl 中

java - 使用 sleep() 和 interrupt() 重用线程

java - 如何在java中打乱二维数组

eclipse - Java Eclipse SWT OSX 错误

java - 更改 SWT 表的单元格字体颜色