Как добавить кнопку закрытия с 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");
                }
            }

        });
}

1 ответ

TabItem не имеет этой функциональности (он будет игнорировать SWT.CLOSE стиль вы используете). Нет другого пути (я знаю), чем использование CTabItem вместо этого и использовать стиль SWT.CLOSE, Вам придется заменить TabFolder с CTabFolder также.

Смотрите эту страницу или эту страницу для хорошего примера.

В качестве альтернативы, если вы не можете отойти от TabItem Вы можете добавить x изображение для каждой вкладки с помощью item.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();
    }
}

Результат выглядит так:

Перед закрытием:

Перед закрытием

После закрытия:

После закрытия

Другие вопросы по тегам