2016-06-02 14 views
0

私は3つのボタンを含むパネルを持っています。このパネルをGridBagLayoutの左上のセルに配置します。GridBagLayoutの左上のセルに3つのボタンを含むパネルを配置する方法は?

私の問題は、プログラムを実行するとパネルが左上のセルに配置されていないが、レイアウトの途中にあるということです。 gridxgridyの両方をゼロに設定しました。

private JFrame frame; 

private JMenuBar menuBar; 
private JMenu menuFile; 
private JMenuItem fileItem1; 
private JMenuItem fileItem2; 

private JPanel btnPanel; 
private JButton btnRewind; 
private JButton btnPlayPause; 
private JButton btnFastForward; 

private static boolean shouldFill = true; 
private static boolean shouldWeightX = true; 
private static boolean RIGHT_TO_LEFT = false; 

public JPlayer() { 

} 

public void createAndShowGUI() { 
    frame = new JFrame(); 
    frame.setTitle("JPlayer"); 
    frame.setSize(500, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    addComponentsToPane(frame.getContentPane()); 

    frame.setVisible(true); 
} 

private void addComponentsToPane(Container pane) { 
    if(RIGHT_TO_LEFT) { 
     pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
    } 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    if(shouldFill) { 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
    } 

    btnRewind = new JButton(); 
    try { 
     Image imgRewind = ImageIO.read(getClass().getResource("../utils/images/rewind.png")); 

     btnRewind.setIcon(new ImageIcon(imgRewind)); 
     btnRewind.setOpaque(true); 
     btnRewind.setContentAreaFilled(false); 
     btnRewind.setBorderPainted(false); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    btnPlayPause = new JButton(); 
    try { 
     Image imgPlay = ImageIO.read(getClass().getResource("../utils/images/play.png")); 
     Image imgPause = ImageIO.read(getClass().getResource("../utils/images/pause.png")); 

     btnPlayPause.setIcon(new ImageIcon(imgPlay)); 
     btnPlayPause.setOpaque(true); 
     btnPlayPause.setContentAreaFilled(false); 
     btnPlayPause.setBorderPainted(false); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    btnFastForward = new JButton(); 
    try { 
     Image imgFastForward = ImageIO.read(getClass().getResource("../utils/images/fast_forward.png")); 

     btnFastForward.setIcon(new ImageIcon(imgFastForward)); 
     btnFastForward.setOpaque(true); 
     btnFastForward.setContentAreaFilled(false); 
     btnFastForward.setBorderPainted(false); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    btnPanel = new JPanel(); 
    btnPanel.add(btnRewind); 
    btnPanel.add(btnPlayPause); 
    btnPanel.add(btnFastForward); 
    btnPanel.setSize(new Dimension(40, 40)); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 

    JButton btn = new JButton("Some Button"); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 1; 
    c.gridy = 0; 

    pane.add(btnPanel, gbc); 
    pane.add(btn, c); 
} 

答えて

3

試行GridBagConstraints.anchorデフォルトの値がCENTERの位置にある試行を試してください。

How to Use GridBagLayout

上で直接ドキュメントから

コンポーネントの表示領域がコンポーネント自体よりも大きい場合は、コンポーネントがGridBagConstraints.anchor制約を使用することによって表示される表示領域に居場所を特定することができます。

アンカー制約の値は絶対的であることができる(北、南、東、西など)、または配向相対(ページの開始時に、行の終わりに、最初の開始時ラインなど)、またはコンポーネントのベースラインからの相対的な値です。

enter image description here

  1. あなたはのGridBagConstraintsの複数のインスタンスを使用する必要はありません。パネルにコンポーネントを追加する前に、制約を作成して制約を更新するだけです。このようにして、すべてに共通する既存の制約を再利用することができます。

  2. weightxweightyanchorの制約を正しく使用するように設定することを忘れないでください。重みを指定

    重い同じドキュメントから直接

weightxには、コンポーネントのGridBagLayoutコントロールの外観に大きな影響を与えることができる技術です。重みは、列(weightx)と行(weighty)の間にスペースを分散する方法を決定するために使用されます。これはサイズ変更動作を指定する上で重要です。

、あなたがweightxにまたは重いための少なくとも一つの非ゼロ値を指定しない限り、すべてのコンポーネントがコンテナの中央に集まってしまいます。これは、ウェイトが0.0(デフォルト)の場合、GridBagLayoutはセルのグリッドとコンテナのエッジの間に余分なスペースを配置するためです。

関連する問題