現在のタブを閉じるには、タブに閉じるボタンを追加する必要があります。
私は検索してきましたが、理解しているように、JPanel から拡張して、ここで言う ように閉じるボタンを追加する必要があります。
よろしくお願いいたします。お時間をいただき、ありがとうございました。
現在のタブを閉じるには、タブに閉じるボタンを追加する必要があります。
私は検索してきましたが、理解しているように、JPanel から拡張して、ここで言う ように閉じるボタンを追加する必要があります。
よろしくお願いいたします。お時間をいただき、ありがとうございました。
基本的に、タブの「レンダラー」を指定する必要があります。詳細については、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
)を使用して、タブとそれに関連するコンポーネントを検索して削除します。
少なくとも彼らのものでは、それを行うように見えるタブの例(Javaサイトから)を見つけました。(過去に試したときは、現在選択されているタブも閉じたと思いましたが、例を実行すると正しく動作しますが、タブ付きのJavaメモ帳で動作するように更新したときは閉じていたと思います現在選択されているタブですが、間違っていた可能性があります。
はい、私のことは今働いています!これは、現在選択されているタブではなく、実際のタブで機能します!
うまくいけば、あなたの質問に対する答えが得られました。私にとって非常に役立つリンクを提供したいと思います。
ここにもいくつかのコードがあります。
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);
}
Peter-Swing については、こちらをご覧ください。その中にJClosableTabbedPane
クラスがあり、他の多くのクラスもあります。
ファイルをダウンロードするjar
と、それを実行して、すべてのクラスの例を見ることができます。
「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));
}
}
jbCloseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
jtbMainTabbedPane.remove(index);
}
});