2017-03-01 36 views
2

我在JTabbedPane中3个标签,我想有他们彼此相邻,就像这样: How it should looked, tabs next to each other如何设置JTabbed面板的宽度以适应标签

但是,我没有找到如何全自动设置JTabbedPane的宽度,从而使标签接下来会彼此适应,所以我只是tabs.setPreferredSize(new Dimension(210, 300));

这有当然有很多问题,主要是它甚至不所有的系统都设置宽度: How it shouldn't look, tabs in 2 rows

更不用说问题了w ith重命名或添加/删除选项卡。

那么,有没有一种很好的方法来计算标签名称的宽度,然后传入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] 

Tabs in the small, reproducable example

+1

看是否有此主题帮助:http://stackoverflow.com/questions/9636601/tabs-at-固定位置在jtabbedpane或在一行 – Berger

+0

感谢您的链接,一个可行的解决方案,最坏的情况。顺便说一句我已经尝试了'pane.getUI()。getTabBounds(pane,i).width',但它返回前-8个选项卡。只有第三个标签具有正确的'65'宽度。 – kajacx

+0

请发布您的[mcve],证明您的问题。请参阅[我应该避免在Java Swing中使用setPreferred | Maximum | MinimumSize?](http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java -swi),普遍的共识是肯定的。我认为这是一个布局问题(或可能是空布局问题) – Frakcool

回答

3

但它返回-8进行第2个突出部。只有第三个选项卡的正确宽度为65.

似乎对我来说有点麻烦。在我的代码中,我通过调用pack()两次来解决这个问题。

这里是我的实现,它覆盖的getPreferredSize()方法(与上面的黑客):

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); 
     }); 
    } 
} 
+0

谢谢,调用'pack()'后宽度正确,所以调用第二个'pack()'将会注册正确的大小。 – kajacx

+0

@kajacx,很高兴的建议帮助。不要忘了点击勾号“接受”答案,以便人们知道问题已经解决。 – camickr

+0

啊,对不起,忘记接受后,我在我的实际应用程序中实现此。 – kajacx

相关问题