2016-08-02 11 views
2

異なるサイズのパネルにコンポーネントを配置しようとしています。しかし、私はGridLayoutが同じサイズの部品を分割することに気付きました。画像異なるサイズのスイングパネル

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class PanelDemo { 

    PanelDemo() { 

     // Create a new JFrame container. Use the default 
     // border layout. 
     JFrame jfrm = new JFrame("Use Three JPanels with Different Sizes"); 

     // Specify FlowLayout manager. 
     jfrm.getContentPane().setLayout(new GridLayout(1, 3)); 

     // Give the frame an initial size. 
     jfrm.setSize(900, 300); 

     // Terminate the program when the user closes the application. 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create the first JPanel. 
     JPanel jpnl = new JPanel(); 

     jpnl.setLayout(new GridLayout(2, 4)); 

     // Set the preferred size of the first panel. 
     jpnl.setPreferredSize(new Dimension(500, 300)); 

     // Make the panel opaque. 
     jpnl.setOpaque(true); 

     // Add a blue border to the panel. 
     jpnl.setBorder(
       BorderFactory.createLineBorder(Color.BLUE)); 

     // Create the second JPanel. 
     JPanel jpnl2 = new JPanel(); 

     //jpnl2.setLayout(new FlowLayout()); 
     // Set the preferred size of the second panel. 
     jpnl2.setPreferredSize(new Dimension(300, 300)); 

     // Make the panel opaque. 
     jpnl2.setOpaque(true); 

     jpnl2.setBorder(
       BorderFactory.createLineBorder(Color.RED)); 

     JPanel jpnl3 = new JPanel(); 
     jpnl3.setOpaque(true); 
     jpnl3.setPreferredSize(new Dimension(100, 300)); 
     jpnl3.setBorder(
       BorderFactory.createLineBorder(Color.ORANGE)); 

     // Add the panels to the frame. 
     jfrm.getContentPane().add(jpnl); 
     jfrm.getContentPane().add(jpnl3); 
     jfrm.getContentPane().add(jpnl2); 

     // Display the frame. 
     jfrm.setVisible(true); 
    } 

    public static void main(String args[]) { 
     // Create the frame on the event dispatching thread. 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new PanelDemo(); 
      } 
     }); 
    } 
} 
+1

'BorderLayout'がCENTER'&' LINE_END'制約はそれを行うことができ、 '、' LINE_START'を使用。しかし、GUIがサイズ変更可能な場合、センターパネルは余分なスペースを取得します.. –

+0

BTW - 各パネルには何がありますか? 'components'の場合​​は、明示的に設定するのではなく、パネルに使用されているレイアウトに推奨サイズに関するヒントを与えることをお勧めします。 'jfrm.setSize(900、300);を呼び出すのではなく、 'jfrm.pack();'(すべてのコンポーネントが追加された後).. –

+1

BoxLayout? GridBagLayout? [Layout Manager](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)のSwingチュートリアルを読んでください。各レイアウトマネージャは、フレームサイズが変更されると、サイズ変更のための異なるルールを持ちます。使用するレイアウトは、正確な要件に依存します。各レイアウトマネージャーと一緒に遊んで、あなたの要件に最も適したものを決定してください。 – camickr

答えて

3

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class TwoPanelWithButtonsLayout { 

    private JComponent ui = null; 
    private Insets buttonMargin = new Insets(10,10,10,10); 

    TwoPanelWithButtonsLayout() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     int gap = 5; 

     JPanel buttons1 = new JPanel(new GridLayout(2, 4, gap, gap)); 
     // 50 is the gap on right, alter as needed 
     buttons1.setBorder(new EmptyBorder(0, 0, 0, 50)); 
     for (int ii=1; ii<9; ii++) { 
      buttons1.add(getBigButton("" + ii)); 
     } 
     ui.add(buttons1, BorderLayout.CENTER); 

     JPanel buttons2 = new JPanel(new GridLayout(2, 2, gap, gap)); 
     for (int ii=1; ii<5; ii++) { 
      buttons2.add(getBigButton("" + ii)); 
     } 
     ui.add(buttons2, BorderLayout.LINE_END); 
    } 

    private JButton getBigButton(String text) { 
     JButton b = new JButton(text); 
     Font f = b.getFont(); 
     b.setFont(f.deriveFont(f.getSize()*3f)); 
     b.setMargin(buttonMargin); 
     return b; 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       TwoPanelWithButtonsLayout o = new TwoPanelWithButtonsLayout(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

ありがとう私はそれを現在検討中です – swinger

+0

Byあなたはフォームビルダー(ideのGUIメーカ)を好みますか、または手書きでGUIを作っていますか?フォームビルダを好むなら、あなたが使っていることを教えてもらえますか? – swinger

+0

GUIを手作業で作っています。フォームビルダーはプロトタイプ作成には適していますが、あまり多くはありません。さらに、それらを効果的に使用するには、どのような場合でもレイアウトの使用方法と組み合わせ方法を理解する必要があります。 –

3

以下に説明するように、それを達成することができますどのようにあなたはFlowLayoutを使用することができますが、彼らはあなたのフレームのサイズを変更する場合、それは、パネルをラップします。

+0

左右のスペースはどうなっていますか? – swinger

+0

FlowLayoutには水平方向の空白があり、ゼロに設定できます。 javadocを参照してください:http://docs.oracle.com/javase/8/docs/api/java/awt/FlowLayout.html#FlowLayout-int-int-int- – Jayfray

関連する問題