如何设置 JTabbed 窗格的宽度以适合选项卡
How to set width of JTabbed pane to fit the tabs
我的 JTabbedPane 中有 3 个选项卡,我想让它们并排放置,如下所示:
但是,我没有找到如何自动设置 JTabbedPane 的宽度,以便选项卡彼此相邻,所以我只是将宽度设置为 tabs.setPreferredSize(new Dimension(210, 300));
这当然有很多问题,主要是它甚至不能在所有系统上工作:
更不用说重命名或 adding/removing 标签的问题了。
那么,有没有一种好的方法可以计算标签名称的宽度,然后传递给 setPrefferedSize()
方法,或者更好的是,某些 setWidthToFitTabs()
方法?
编辑:最小的完整示例:
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Tabs text");
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Tab1", new JLabel("Content1"));
tabs.addTab("Tab2", new JLabel("Content2"));
tabs.addTab("Tab3", new JLabel("Content3"));
tabs.addTab("Tab4", new JLabel("Content4"));
for (int i = 0; i < tabs.getTabCount(); i++) {
System.out.println(tabs.getUI().getTabBounds(tabs, i));
}
frame.add(tabs);
frame.pack();
frame.setVisible(true);
});
结果:
java.awt.Rectangle[x=2,y=59,width=-8,height=19]
java.awt.Rectangle[x=2,y=40,width=-8,height=19]
java.awt.Rectangle[x=2,y=21,width=-8,height=19]
java.awt.Rectangle[x=2,y=2,width=49,height=19]
but it returns -8 for the first 2 tabs. Only the third tab has correct width of 65.
对我来说似乎有点问题。在我下面的代码中,我通过调用 pack() 两次来解决这个问题。
这是我覆盖 getPreferredSize() 方法的实现(使用上述 hack):
import java.awt.*;
import javax.swing.*;
public class Main
{
public static void main(String[] args) throws Exception
{
SwingUtilities.invokeLater(() ->
{
JFrame frame = new JFrame("Tabs text");
JTabbedPane tabs = new JTabbedPane()
{
@Override
public Dimension getPreferredSize()
{
int tabsWidth = 0;
for (int i = 0; i < getTabCount(); i++) {
tabsWidth += getBoundsAt(i).width;
}
Dimension preferred = super.getPreferredSize();
preferred.width = Math.max(preferred.width, tabsWidth);
return preferred;
}
};
tabs.addTab("Tab1", new JLabel("Content1"));
tabs.addTab("Tab2", new JLabel("Content2"));
tabs.addTab("Tab3", new JLabel("Content3"));
tabs.addTab("Tab4", new JLabel("Content4"));
frame.add(tabs);
frame.pack();
frame.pack();
frame.setVisible(true);
});
}
}
我的 JTabbedPane 中有 3 个选项卡,我想让它们并排放置,如下所示:
但是,我没有找到如何自动设置 JTabbedPane 的宽度,以便选项卡彼此相邻,所以我只是将宽度设置为 tabs.setPreferredSize(new Dimension(210, 300));
这当然有很多问题,主要是它甚至不能在所有系统上工作:
更不用说重命名或 adding/removing 标签的问题了。
那么,有没有一种好的方法可以计算标签名称的宽度,然后传递给 setPrefferedSize()
方法,或者更好的是,某些 setWidthToFitTabs()
方法?
编辑:最小的完整示例:
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Tabs text");
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Tab1", new JLabel("Content1"));
tabs.addTab("Tab2", new JLabel("Content2"));
tabs.addTab("Tab3", new JLabel("Content3"));
tabs.addTab("Tab4", new JLabel("Content4"));
for (int i = 0; i < tabs.getTabCount(); i++) {
System.out.println(tabs.getUI().getTabBounds(tabs, i));
}
frame.add(tabs);
frame.pack();
frame.setVisible(true);
});
结果:
java.awt.Rectangle[x=2,y=59,width=-8,height=19]
java.awt.Rectangle[x=2,y=40,width=-8,height=19]
java.awt.Rectangle[x=2,y=21,width=-8,height=19]
java.awt.Rectangle[x=2,y=2,width=49,height=19]
but it returns -8 for the first 2 tabs. Only the third tab has correct width of 65.
对我来说似乎有点问题。在我下面的代码中,我通过调用 pack() 两次来解决这个问题。
这是我覆盖 getPreferredSize() 方法的实现(使用上述 hack):
import java.awt.*;
import javax.swing.*;
public class Main
{
public static void main(String[] args) throws Exception
{
SwingUtilities.invokeLater(() ->
{
JFrame frame = new JFrame("Tabs text");
JTabbedPane tabs = new JTabbedPane()
{
@Override
public Dimension getPreferredSize()
{
int tabsWidth = 0;
for (int i = 0; i < getTabCount(); i++) {
tabsWidth += getBoundsAt(i).width;
}
Dimension preferred = super.getPreferredSize();
preferred.width = Math.max(preferred.width, tabsWidth);
return preferred;
}
};
tabs.addTab("Tab1", new JLabel("Content1"));
tabs.addTab("Tab2", new JLabel("Content2"));
tabs.addTab("Tab3", new JLabel("Content3"));
tabs.addTab("Tab4", new JLabel("Content4"));
frame.add(tabs);
frame.pack();
frame.pack();
frame.setVisible(true);
});
}
}