32

現在のタブを閉じるには、タブに閉じるボタンを追加する必要があります。

私は検索してきましたが、理解しているように、JPanel から拡張して、ここで言う ように閉じるボタンを追加する必要があります。

よろしくお願いいたします。お時間をいただき、ありがとうございました。

4

7 に答える 7

50

基本的に、タブの「レンダラー」を指定する必要があります。詳細については、JTabbedPane.setTabComponentAt(...)を参照してください。

基本的な考え方は、タブに配置されるコンポーネントを提供することです。

私は通常、JPanelを作成し、その上にJLabel(タイトル用)を追加し、表示する内容に応じて、クローズアクションとして機能するある種のコントロールを追加します。

tabPane.addTab(title, tabBody);
int index = tabPane.indexOfTab(title);
JPanel pnlTab = new JPanel(new GridBagLayout());
pnlTab.setOpaque(false);
JLabel lblTitle = new JLabel(title);
JButton btnClose = new JButton("x");

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;

pnlTab.add(lblTitle, gbc);

gbc.gridx++;
gbc.weightx = 0;
pnlTab.add(btnClose, gbc);

tabPane.setTabComponentAt(index, pnlTab);

btnClose.addActionListener(myCloseActionHandler);

今どこかで、私はアクションハンドラーを確立します...

public class MyCloseActionHandler implements ActionListener {

    public void actionPerformed(ActionEvent evt) {

        Component selected = tabPane.getSelectedComponent();
        if (selected != null) {

            tabPane.remove(selected);
            // It would probably be worthwhile getting the source
            // casting it back to a JButton and removing
            // the action handler reference ;)

        }

    }

}

これで、好きなコンポーネントを簡単に使用して、マウスリスナーをそのコンポーネントに接続し、マウスのクリックを監視できます...

更新しました

上記の例では、現在アクティブなタブのみが削除されます。これを修正するには、いくつかの方法があります。

最善の方法は、アクションが関連付けられているタブを見つけるための何らかの手段を提供することです...

public class MyCloseActionHandler implements ActionListener {

    private String tabName;

    public MyCloseActionHandler(String tabName) {
        this.tabName = tabName;
    }

    public String getTabName() {
        return tabName;
    }

    public void actionPerformed(ActionEvent evt) {

        int index = tabPane.indexOfTab(getTabName());
        if (index >= 0) {

            tabPane.removeTabAt(index);
            // It would probably be worthwhile getting the source
            // casting it back to a JButton and removing
            // the action handler reference ;)

        }

    }

}   

これは、タブの名前(で使用されるJTabbedPane#addTab)を使用して、タブとそれに関連するコンポーネントを検索して削除します。

于 2012-07-19T02:51:35.913 に答える
6

少なくとも彼らのものでは、それを行うように見えるタブの例(Javaサイトから)を見つけました。(過去に試したときは、現在選択されているタブも閉じたと思いましたが、例を実行すると正しく動作しますが、タブ付きのJavaメモ帳で動作するように更新したときは閉じていたと思います現在選択されているタブですが、間違っていた可能性があります。

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ButtonTabComponent.java

はい、私のことは今働いています!これは、現在選択されているタブではなく、実際のタブで機能します!

于 2013-08-26T03:11:52.553 に答える
2

うまくいけば、あなたの質問に対する答えが得られました。私にとって非常に役立つリンクを提供したいと思います。

閉じるボタンのある JTabbedPane

ここにもいくつかのコードがあります。

public static void createAndShowGUI()
{
    JFrame frame = new JFrame("Tabs");
    frame.setMinimumSize(new Dimension(500, 200));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTabbedPane tabbedPane = new JTabbedPane();

    JPanel panel = new JPanel();
    panel.setOpaque(false);
    tabbedPane.add(panel);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel), getTitlePanel(tabbedPane, panel, "Tab1"));

    JPanel panel1 = new JPanel();
    panel1.setOpaque(false);
    tabbedPane.add(panel1);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel1), getTitlePanel(tabbedPane, panel1, "Tab2"));

    JPanel panel2 = new JPanel();
    panel2.setOpaque(false);
    tabbedPane.add(panel2);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel2), getTitlePanel(tabbedPane, panel2, "Tab3"));

    JPanel panel3 = new JPanel();
    panel3.setOpaque(false);
    tabbedPane.add(panel3);
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel3), getTitlePanel(tabbedPane, panel3, "Tab4"));

    frame.add(tabbedPane);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
}
于 2014-02-16T11:27:33.630 に答える
1

Peter-Swing については、こちらをご覧ください。その中にJClosableTabbedPaneクラスがあり、他の多くのクラスもあります。

ファイルをダウンロードするjarと、それを実行して、すべてのクラスの例を見ることができます。

于 2014-11-19T02:07:26.293 に答える
1

「x」という名前の JLabel を持ち、mouseListener を使用できます。

 private final JLabel l = new JLabel(); // this is the label for tabbedPane
 private final JLabel b = new JLabel("x");//Close Button
 if (closeable)
        {
            b.setToolTipText("Click to close");

            b.setOpaque(false);
            b.setBackground(Color.gray);

            b.addMouseListener(new MouseAdapter()
            {
                @Override
                public void mouseExited(MouseEvent e)
                {
                    b.setBorder(bordere);
                    b.setOpaque(false);
                }

                @Override
                public void mouseEntered(MouseEvent e)
                {
                    b.setBorder(borderl);
                }

                @Override
                public void mouseReleased(MouseEvent e)
                {
                    b.setOpaque(false);
                    b.repaint();

                    if (b.contains(e.getPoint()))
                    {
                        b.setBorder(borderl);

                        if (confirmTabClosing())
                        {
                            tab.remove(tabIndex());
                            if(tab.getTabCount() == 0)
                                spacialTabComponent.maximizeOrRestore.doClick();
                        }
                    }
                    else
                        b.setBorder(bordere);

                }

                @Override
                public void mousePressed(MouseEvent e)
                {
                    b.setOpaque(true);
                    b.repaint();
                }
            });

            b.setBorder(bordere);
            add(b, getLeftAlignedBothFilledGBC(1, 0, new Insets(0, 0, 0, 0), 0, 0));
        }



    }
于 2014-12-02T12:18:18.273 に答える
1
jbCloseButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
                jtbMainTabbedPane.remove(index);
            }
});
于 2015-10-24T11:17:06.490 に答える