2012-09-26 3 views
5

こんにちは皆私は内部に3つのコンポーネントを持つJFrameを持っています。Java Swing:グリッドレイアウトで1行のサイズを変更し、それを垂直方向ではなく水平方向にのみ動的にサイズ変更する方法を教えてください。

  1. メニュー
  2. Aはペイン
  3. 最初は私の目標は、次のようなデザインを作成することでしたいくつかのボタン

を持っているパネルのタブ: enter image description here

ユーザーをアプリケーションのサイズを変更すると、すべてのサイズが変更されます。だから私は、私はシンプルなグリッドレイアウトを使用した場合、私の問題が解決されるだろう、私は次のことを行うことを決めたかもしれないと思った:

  1. タブ付きペインには、内部のいくつかのパネルを持っていますし、これらのパネルは、グリッドレイアウトに従います。

  2. 下部のパネルはグリッドレイアウトに従います。

  3. JFrameもグリッドレイアウトに従います。

結果:

enter image description here

あなたは、これは私が望んでいたものではありません見ることができるように、ボタンが大きすぎると、アプリケーションが非常によくリサイズするものの:

enter image description here

ボタンのサイズも変更されますが、ボタンは大きすぎます。ボタンのサイズを小さくする(より具体的にはパネルが含まれている)ようにしたいと思います。ユーザーがアプリケーションのサイズを変更すると、ボタンは垂直方向には水平にしか変形されません。つまり、タブ付きのペインが大きくなる垂直に これは達成可能ですか?私は検索し、gridbaglayoutについて知った、私は少し再生を開始したが、私は何も達成していない。私がやることをどうにかすべては以下の通りです:

enter image description here

良いようだが、私は、これは私が得るものであるサイズを変更する場合:事前に

enter image description here

感謝。

答えて

10

コンテンツペインにはBorderLayoutを使用します。 BorderLayout.CENTERを使用してタブ付き枠を置き、BorderLayout.SOUTHを使用するボタンのパネルを配置します。

+0

+1私は、これはあまりにも動作しますだと思います。下のパネルの 'setPreferredSize'。それはその高さを一定にします。センターパネルのサイズを設定しないでください。そうすることで、他のものはすべてサイズを維持し、ウィンドウを展開するとセンターのみが展開されます。また、下のパネルは 'FlowLayout'を使うべきです。 – davidXYZ

+1

@davidXYZ下のパネルに優先サイズを設定する必要はありません。好ましいサイズの設定は例外です! –

+0

@davidXYZあなたは[this](http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi)の読書を前にしたいかもしれませんあなたはpref/max/minのサイズをつぶすようになります – MadProgrammer

7

JFrameもグリッドレイアウトに従います。

これは問題です。代わりに、意味している(いずれかの制約を受けることなく、あなたのタブ付きペインを追加制約BorderLayout.SOUTH

  • を使用してボタンパネルを追加し、

    1. (そう、あなたのGridLayoutにJFrameののレイアウトを設定呼び出しを削除)、デフォルトBorderLayoutを使用制約BorderLayout.CENTER

    は、BorderLayoutに関する例をSwing LayoutManager tutorialで、特に見てみましょう。

    小さな例:

    import java.awt.BorderLayout; 
    import java.awt.GridLayout; 
    
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JMenu; 
    import javax.swing.JMenuBar; 
    import javax.swing.JMenuItem; 
    import javax.swing.JPanel; 
    import javax.swing.JTabbedPane; 
    import javax.swing.SwingUtilities; 
    
    public class TestLayout { 
    
        protected void initUI() { 
         final JFrame frame = new JFrame(TestLayout.class.getSimpleName()); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         JMenuBar menuBar = new JMenuBar(); 
         JMenu fileMenu = new JMenu("File"); 
         JMenuItem newItem = new JMenuItem("New..."); 
         JMenuItem open = new JMenuItem("Open..."); 
         fileMenu.add(newItem); 
         fileMenu.add(open); 
         menuBar.add(fileMenu); 
         JTabbedPane tabs = new JTabbedPane(); 
         tabs.addTab("Tab 1", new JPanel()); 
         tabs.addTab("Tab 2", new JPanel()); 
         tabs.addTab("Tab 3", new JPanel()); 
         JPanel buttonPanel = new JPanel(new GridLayout()); 
         buttonPanel.add(new JButton("Button-1")); 
         buttonPanel.add(new JButton("Button-2")); 
         buttonPanel.add(new JButton("Button-3")); 
         frame.add(tabs); 
         frame.add(buttonPanel, BorderLayout.SOUTH); 
         frame.setJMenuBar(menuBar); 
         frame.pack(); 
         frame.setVisible(true); 
        } 
    
        public static void main(String[] args) { 
         SwingUtilities.invokeLater(new Runnable() { 
    
          @Override 
          public void run() { 
           new TestLayout().initUI(); 
          } 
         }); 
        } 
    } 
    
  • 関連する問題