我正在尝试创建一个JTabbedPane,以便最终的#34;标签"实际上是一个按钮,它将打开一个对话框以向选项卡式窗格添加内容。我试着查看JTabbedPane的源代码,但我找不到选项卡对象(可点击的行和#34;按钮"点击时更改当前可见的组件)的实际位置。有一个页面对象的私有列表(因此无论如何它们都不能被子类访问)但它们只包含有关选项卡的信息而不是选项卡对象本身。我的目标是能够添加一个位于选项卡列表之后的按钮(水平)。
我还尝试使用JTabbedPane.setTabComponentAt()将最终制表符的字符串更改为组件为null的JButton,但仍然添加了制表符组件。如果单击选项卡中按钮的右侧/左侧,将显示一个空白选项卡,因为它总是在组件周围填充。或许还有办法摆脱这种局面?但我想在一些外观和感觉中有这样的标签:/ --- \而不是这个:| --- |您仍然可以单击选项卡但不单击按钮。
有没有人知道如何在不编写我自己的JTabbedPane版本的情况下获得我想要的东西?
谢谢!
答案 0 :(得分:3)
我的目标是能够在标签列表之后(水平地)添加一个按钮。
正确的解决方案是编写自定义用户界面,但这可能很复杂,而且我不确定要更改的代码。
作为一个简单的黑客,您可以使用OverlayLayout来显示选项卡式窗格顶部/右侧的按钮:
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;
public class TabbedPaneWithComponent
{
private static void createAndShowUI()
{
JPanel panel = new JPanel();
panel.setLayout( new OverlayLayout(panel) );
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("1", new JTextField("one"));
tabbedPane.add("2", new JTextField("two"));
tabbedPane.setAlignmentX(1.0f);
tabbedPane.setAlignmentY(0.0f);
JCheckBox checkBox = new JCheckBox("Check Me");
checkBox.setOpaque( false );
checkBox.setAlignmentX(1.0f);
checkBox.setAlignmentY(0.0f);
panel.add( checkBox );
panel.add(tabbedPane);
JFrame frame = new JFrame("TabbedPane With Component");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( panel );
frame.setLocationByPlatform( true );
frame.setSize(400, 100);
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
非常好用,除非选项卡式窗格的宽度变得太小而按钮与选项卡重叠。