1

我试图让JTabbedPane所有选项卡(实际选项卡,而不是组件)具有相同的宽度(最宽标签所需的最小宽度或恒定宽度)。

我试图覆盖BasicTabbedPaneUI.getTabBounds(int tabIndex, Rectangle dest),但显然 的绘画方法并未使用此方法BasicTabbedPaneUI,而是使用 rects 数组来确定选项卡大小。

我的下一个方法是覆盖JTabbedPane.insertTab(String title, Icon icon, Component component, String tip, int index)并设置标签组件的首选大小,但这似乎不是很优雅,我什至不确定它是否会起作用。

有没有办法做到这一点?

4

4 回答 4

5

答案很简单。当我们为选项卡命名时,只需使用 html 格式化名称。说

tp - JTabbedPane 对象

tp.addTab("<html><body><table width='150'>Name</table></body></html>",Componentobject)
于 2009-10-30T09:19:18.487 回答
4

我认为它没有你做的那么复杂。只需将 setTabComponentAt() 与您设置了首选大小的 JLabel 一起使用。

于 2009-01-24T22:17:34.237 回答
1

我尝试了以下方法:

tabPane.setUI(new javax.swing.plaf.metal.MetalTabbedPaneUI() {
    @Override
    protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) {
        return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight) + 12;
    }
});

这对我来说似乎很好。但是,如果您使用不同的 L&F,无论如何您最终都会使用“金属”来渲染它。

我想你可以得到默认的 UI 并在它上面做一个“instanceof”来确定哪个正在被使用并相应地实例化它。

例如:

TabbedPaneUI ui = tabPane.getUI();

if (ui instanceof WindowsTabbedPaneUI) {
    // Create the windows rendition
} else if (ui instanceof MetalTabbedPaneUI) {
    // Create the metal rendition
} else if (ui instanceof MotifTabbedPaneUI) {
    // Create the motif rendition
} else if (ui instanceof SynthTabbedPaneUI) {
    // Etc...
}
于 2011-11-13T07:59:28.457 回答
1

这对我有用。

 JLabel lab = new JLabel();
        lab.setPreferredSize(new Dimension(200, 30));
        jTabbedPane1.setTabComponentAt(0, lab);  // tab index, jLabel

或尝试对相同大小的所有选项卡组件进行此更改(在 main 方法中调用)

UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab.contentMargins", new Insets(10, 100, 0, 0));

于 2014-06-03T02:03:14.880 回答