如何更改java中选项卡标签的宽度,但保留“选择”选项

时间:2014-04-16 22:02:50

标签: java html swing jtabbedpane

我的程序中有一个JTabbedPane对象,我会覆盖getForegroundAtgetBackgroundAt方法,以便在选择或不选中时使用不同的背景颜色。我想改变标签的宽度和高度。我设法使用类似如下的代码来做到这一点:

 jtp.addTab("<html><body><table width='200'>Main</table></body></html>", mainPanel);

问题在于,如果我使用此html代码更改选项卡的宽度,则不会再调用我覆盖的方法,因为选项是使用html代码设置的。有办法解决这个问题吗?我是否可以使用html代码来更改选项卡的背景颜色,具体取决于它是否被选中?感谢。

1 个答案:

答案 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);
  }
}