Java:为JTabbedPane添加选项卡按钮

8

是否可以在选项卡窗格中像Firefox一样添加按钮?

enter image description here

我想要的是加号按钮。

谢谢

4个回答

9

我认为你可以通过构建自己的JTabbedPaneUI并使用setUIJTabbedPane上设置它来管理它。

你的ComponentUI有获取可访问子元素的方法。如果你指定了一个JButton和一个JLabel,那么你可能成功了。

虽然我没有尝试过这种方法。这是“自担风险” :)


1
使用自定义用户界面是正确的方法。我以前做过类似的事情。对于选项卡上的“X”来关闭它,您可以覆盖选项卡本身的绘制以包括X,并安装一个鼠标侦听器来检查用户是否选择了该区域与X。 - Jeff Storey
2
Sun的“选项卡窗格”教程包括一个这样特性的示例:http://java.sun.com/docs/books/tutorial/uiswing/components/tabbedpane.html - trashgod

3
你可以试试这个:
public static void main (String[] args) {
    JFrame parent = new JFrame ();

    final JTabbedPane pane = new JTabbedPane ();
    pane.addTab ("test", null);
    FlowLayout f = new FlowLayout (FlowLayout.CENTER, 5, 0);

    // Make a small JPanel with the layout and make it non-opaque
    JPanel pnlTab = new JPanel (f);
    pnlTab.setOpaque (false);
    // Create a JButton for adding the tabs
    JButton addTab = new JButton ("+");
    addTab.setOpaque (false); //
    addTab.setBorder (null);
    addTab.setContentAreaFilled (false);
    addTab.setFocusPainted (false);

    addTab.setFocusable (false);

    pnlTab.add (addTab);

    pane.setTabComponentAt (pane.getTabCount () - 1, pnlTab);

    ActionListener listener = new ActionListener () {
        @Override
        public void actionPerformed (ActionEvent e) {
            String title = "Tab " + String.valueOf (pane.getTabCount () - 1);
            pane.addTab (title, new JLabel (title));
        }
    };
    addTab.setFocusable (false);
    addTab.addActionListener (listener);
    pane.setVisible (true);

    parent.add (pane);
    parent.setSize (new Dimension (400, 200));
    parent.setVisible (true);
}

Screenshot


我仍然看到一个带有按钮的选项卡,而不是选项卡上的按钮... - qraqatit

1
在类的默认构造函数中编写以下代码。
    JPanel panel = new JPanel();
    tabbedPane.addTab("Welcome", null, panel, null);
    tabbedPane.addTab(" + ", null, panel1, null);

    tabbedPane.addChangeListener(new ChangeListener()
    {
        public void stateChanged(ChangeEvent evt)
        {
            JTabbedPane tabbedPane = (JTabbedPane)evt.getSource();

            if(tabbedPane.getSelectedIndex() == tabbedPane.indexOfTab(" + "))
            {
                createTab();
            }
        }
    });

在主类的开头创建方法来声明和初始化 int tab2 = 2;。它能够正常工作。
private void createTab()
{
    tabbedPane.addTab("New Tab",new Panel());
    tabbedPane.addTab(" + ",null,panel1,null);
    tabbedPane.setSelectedIndex(tab2);
    tab2++;
}

如果其中一个创建的选项卡叫做“+”,怎么办?有没有更好的方法来判断是否选择了最后一个选项卡? - Aaron Esau

0

我尝试了几种解决方案,最终得出了这个:

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class TestTab {

    public static void main(String[] args) {
    JFrame parent = new JFrame();

    final JTabbedPane tabEntity = new JTabbedPane();
    tabEntity.addTab("Details", null, new JScrollPane());
    tabEntity.addTab("Context", null, new JScrollPane());
    tabEntity.addTab("", null, new JScrollPane());

    addButtonToTab(tabEntity);

    parent.add(tabEntity);
    parent.setSize(new Dimension(400, 200));
    parent.setVisible(true);
    }

    public static void addButtonToTab(final JTabbedPane tabEntity) {
    tabEntity.setTabComponentAt(tabEntity.getTabCount() - 1, new JButton(
        "+"));
    }
}

所以你有:

Button near tab example


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接