2017-03-01 7 views
2

タブに合うようにJTabbedペインの幅を設定し、私はこのように、隣同士にそれらを持っていると思います: How it should looked, tabs next to each otherは、どのように私は私のJTabbedPaneで3つのタブを持って

しかし、私はどのように見つけることができませんでしたタブが隣同士に合うなるように自動に、JTabbedPaneの幅を設定するので、私はちょうどこれは主に、それもすべてのシステム上では動作しません、もちろん、多くの問題を抱えているtabs.setPreferredSize(new Dimension(210, 300));

で幅を設定します。 How it shouldn't look, tabs in 2 rows

問題点w iタブの名前変更や追加/削除。

したがって、タブ名の幅を計算してsetPrefferedSize()メソッドに渡すか、さらに良い方法ではsetWidthToFitTabs()メソッドに渡すのが良い方法はありますか?

EDIT:最小の完全な例:

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

を参照してください:ここで

は、(上記のハックで)のgetPreferredSize()メソッドをオーバーライドし、私の実装ですhttp://stackoverflow.com/questions/9636601/tabs-at- jtabbed-in-one-rowの固定ポジション – Berger

+0

リンクありがとうございました。ワーストケースのシナリオで実行可能なソリューションです。私は 'pane.getUI()。getTabBounds(pane、i).width'を試しましたが、最初の2つのタブは' -8'を返します。 3番目のタブだけが正しい幅「65」を持ちます。 – kajacx

+0

あなたの問題を示す[mcve]を投稿してください。 「Java SwingではsetPreferred | Maximum | MinimumSizeの使用を避けるべきですか?」(http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java)を参照してください。 - スイス)、一般的な合意は「はい」と言います。私はこれがレイアウトの問題(またはヌルレイアウトの問題かもしれない)だと思います – Frakcool

答えて

3

それは返し-8第2のタブのため。 3番目のタブのみが正しい幅65を持っています。

私には少しバグがあります。下のコードでは、pack()を2回呼び出すことでこの問題を回避しました。このトピックは場合に役立ちます

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()'を呼び出した後の幅は正しいので、2番目の 'pack()'を呼び出すと正しいサイズが登録されます。 – kajacx

+0

@kajacx、喜んで提案が助けました。チェックマークをクリックして回答を「受け入れる」ことを忘れないでください。人々は問題が解決されたことを知ります。 – camickr

+0

ああ、申し訳ありませんが、私は実際のアプリケーションでこれを実装した後で受け入れを忘れました。 – kajacx

関連する問題