我的程序中有一个JTabbedPane
对象,我会覆盖getForegroundAt
和getBackgroundAt
方法,以便在选择或不选中时使用不同的背景颜色。我想改变标签的宽度和高度。我设法使用类似如下的代码来做到这一点:
jtp.addTab("<html><body><table width='200'>Main</table></body></html>", mainPanel);
问题在于,如果我使用此html代码更改选项卡的宽度,则不会再调用我覆盖的方法,因为选项是使用html代码设置的。有办法解决这个问题吗?我是否可以使用html代码来更改选项卡的背景颜色,具体取决于它是否被选中?感谢。
答案 0 :(得分:2)
这是通过在JTabbedPane的UI中覆盖calculateTabWidth(...)来更改选项卡宽度的一种方法:
编辑: MadProgrammer的评论是正确的。我已将示例从BasicTabbedPaneUI
更改为MetalTabbedPaneUI
,因为这是此示例使用的默认用户界面。如果您为应用指定了特定的L&amp; F,请相应地更改用户界面。
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.metal.*;
public class CustomTabWidthDemo implements Runnable
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new CustomTabWidthDemo());
}
public void run()
{
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.setUI(new MetalTabbedPaneUI()
{
@Override
protected int calculateTabWidth(int tabPlacement, int tabIndex,
FontMetrics metrics)
{
int width = super.calculateTabWidth(tabPlacement, tabIndex, metrics);
int extra = tabIndex * 50;
return width + extra;
}
});
tabbedPane.addTab("JTable", new JScrollPane(new JTable(5,5)));
tabbedPane.addTab("JTree", new JScrollPane(new JTree()));
tabbedPane.addTab("JSplitPane", new JSplitPane());
JPanel p = new JPanel();
p.add(tabbedPane);
JFrame frame = new JFrame();
frame.setContentPane(p);
frame.pack();
frame.setVisible(true);
}
}