Java 如何设置JTabed窗格的宽度以适应选项卡
我的JTabbedPane中有3个选项卡,我希望它们彼此相邻,如下所示: 但是,我没有找到如何自动设置JTabbedPane的宽度,以便选项卡彼此相邻,所以我只是通过Java 如何设置JTabed窗格的宽度以适应选项卡,java,swing,layout,tabs,jtabbedpane,Java,Swing,Layout,Tabs,Jtabbedpane,我的JTabbedPane中有3个选项卡,我希望它们彼此相邻,如下所示: 但是,我没有找到如何自动设置JTabbedPane的宽度,以便选项卡彼此相邻,所以我只是通过tabs.setPreferredSize(新维度(210300))设置宽度 这当然有很多问题,主要是它甚至不适用于所有系统: 更不用说重命名或添加/删除选项卡的问题了 那么,有没有一种计算选项卡名称宽度的好方法,然后传递到setPreferedSize()方法,或者更好的方法,一些setWidthToFitTabs()方法 编
tabs.setPreferredSize(新维度(210300))设置宽度代码>
这当然有很多问题,主要是它甚至不适用于所有系统:
更不用说重命名或添加/删除选项卡的问题了
那么,有没有一种计算选项卡名称宽度的好方法,然后传递到setPreferedSize()
方法,或者更好的方法,一些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);
});
但对于前两个选项卡,它返回-8。只有第三个选项卡的正确宽度为65
对我来说似乎有点讨厌。在下面的代码中,我通过两次调用pack()来解决这个问题
下面是我覆盖getPreferredSize()方法的实现(使用上述hack):
import java.awt.*;
导入javax.swing.*;
公共班机
{
公共静态void main(字符串[]args)引发异常
{
SwingUtilities.invokeLater(()->
{
JFrame=新JFrame(“制表符文本”);
JTabbedPane tabs=新JTabbedPane()
{
@凌驾
公共维度getPreferredSize()
{
int tabsWidth=0;
for(int i=0;i
查看本主题是否有帮助:感谢链接,这是最坏情况下可行的解决方案。顺便说一句,我已经尝试了pane.getUI().gettabounds(pane,I).width
,但是对于前两个选项卡,它返回-8
。只有第三个标签的宽度正确,即65
。请发布您的标签,说明您的问题。看,普遍的共识是肯定的。我认为这可能是一个布局问题(或者可能是一个空布局问题)哦,天哪,“不要使用setPreferedSize
”帖子说你应该扩展JComponent
并覆盖getPreferedSize
方法来返回你想要的维度的缓存副本,这正是默认的getPreffedSize所做的。我将添加一点示例。现在我考虑一下,我总是可以得到最后添加的选项卡的宽度,因为最后一个选项卡的宽度总是正确的。这不考虑填充(如果有的话)以及其他因素,并且与f*ck一样笨拙,但至少它可能会工作。谢谢,在调用pack()
后宽度是正确的,所以调用第二个pack()
将注册正确的尺寸。@kajacx,很高兴这个建议有帮助。不要忘记通过点击复选标记来“接受”答案,这样人们就知道问题已经解决了。啊,对不起,在我在实际应用程序中实现了这一点之后,忘记接受了。
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]
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);
});
}
}