Java 如何将关闭按钮添加到JTabbedPane选项卡?
我使用的是JTabbedPane,我需要在选项卡中添加一个关闭按钮来关闭当前窗格 我一直在搜索,据我所知,我必须从JPanel扩展并添加他们所说的关闭按钮 但是,有没有办法添加扩展JTabbedPane的关闭按钮,或者有没有更简单的方法Java 如何将关闭按钮添加到JTabbedPane选项卡?,java,swing,tabs,jtabbedpane,Java,Swing,Tabs,Jtabbedpane,我使用的是JTabbedPane,我需要在选项卡中添加一个关闭按钮来关闭当前窗格 我一直在搜索,据我所知,我必须从JPanel扩展并添加他们所说的关闭按钮 但是,有没有办法添加扩展JTabbedPane的关闭按钮,或者有没有更简单的方法 提前感谢,我非常感谢您的时间和帮助。基本上,您需要为选项卡提供一个“渲染器”。有关更多信息,请参阅 基本思想是提供一个将在选项卡上布局的组件 我通常创建一个JPanel,在其上添加一个JLabel(标题),并根据我想要显示的内容,添加某种控件作为关闭操作 tab
提前感谢,我非常感谢您的时间和帮助。基本上,您需要为选项卡提供一个“渲染器”。有关更多信息,请参阅 基本思想是提供一个将在选项卡上布局的组件 我通常创建一个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);
}
我对甲骨文的代码做了一些修改 可以在标签上添加一个图标,加上关闭标签按钮。希望对你有所帮助
public static void addTag(JTabbedPane tab, String title, Icon icon, int index){
MouseListener close = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//your code to remove component
//I use this way , because I use other methods of control than normal: tab.remove(int index);
}
};
final ButtonClose buttonClose = new ButtonClose (title, icon, close );
tab.setTabComponentAt(index, buttonClose);
tab.validate();
tab.setSelectedIndex(index);
}
公共类ButtonClose扩展了JPanel{
public ButtonClose(final String title, Icon icon, MouseListener e) {
JLabel ic = new JLabel(icon);
ic.setSize(icone.getIconWidth(), icone.getIconHeight());
JLabel text= new JLabel(title);
text.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
ButtonTab button = new ButtonTab();
button.addMouseListener(e);
button.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
JPanel p = new JPanel();
p.setSize(getWidth() - icone.getIconWidth(), 15);
p.add(text);
p.add(button);
add(ic);
add(p);
}
private class ButtonTab extends JButton {
public ButtonTab() {
int size = 13;
setPreferredSize(new Dimension(size, size));
setToolTipText("Close");
setUI(new BasicButtonUI());
setFocusable(false);
setBorderPainted(false);
addMouseListener(listener);
setRolloverEnabled(true);
}
@Override
public void updateUI() {
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
if (getModel().isPressed()) {
g2.translate(1, 1);
}
g2.setStroke(new BasicStroke(2));
g2.setColor(new Color(126, 118, 91));
if (getModel().isRollover()) {
g2.setColor(Color.WHITE);
}
int delta = 3;
g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
g2.dispose();
}
}
private final MouseListener listener = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setContentAreaFilled(true);
button.setBackground(new Color(215, 65, 35));
}
}
@Override
public void mouseExited(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setContentAreaFilled(false); //transparent
}
}
};
}查看Peter Swing。它有一个jClosableTabedPane
类,以及许多其他类
下载
jar
文件时,您可以运行该文件并提供所有类的示例。您可以使用名为“x”的JLabel并使用鼠标侦听器
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));
}
}
这可能会有帮助-谢谢我要检查出来谢谢!!!看起来很棒。我下午会检查。我真的很感谢你的帮助。如果你阅读了代码,ActionListener正在使用所选的选项卡。你将选项卡组件与action listener相关联,找到索引并删除它,而不是使用其他检查更新请参见(1)中更高的比率。:)但是,您应该知道,这样做会破坏您设置选项卡图标的能力。(除非你想去搞乱底层,看看源代码,做paintComponent()之类有趣的事情,否则我找不到解决这个问题的方法。)
jbCloseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
jtbMainTabbedPane.remove(index);
}
});