2012-10-15 3 views
2

를 왼쪽으로합니다 실행할 때이 예에서자바의 GridBagLayout : 구성 요소 정렬 나는이 <code>GridBagLayout</code>를 사용하여 레이아웃이

public class Example extends JFrame { 
    public Example() { 
     Border outline = BorderFactory.createLineBorder(Color.black); 
     GridBagLayout gbl = new GridBagLayout(); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JPanel pane = new JPanel(gbl); 

     gbc.weighty = 1.0; 
     gbc.weightx = 1.0; 

     JLabel unitLbl = new JLabel("Unit"); 
     unitLbl.setBorder(outline); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.ipadx = 30; 
     gbc.ipady = 10; 
     gbl.setConstraints(unitLbl, gbc); 
     pane.add(unitLbl); 

     JLabel typeLbl = new JLabel("Type"); 
     typeLbl.setBorder(outline); 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.ipadx = 30; 
     gbc.ipady = 10; 
     gbl.setConstraints(typeLbl, gbc); 
     pane.add(typeLbl); 

     JTextField unitField = new JTextField(); 
     typeLbl.setBorder(outline); 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.ipadx = 30; 
     gbc.ipady = 10; 
     gbl.setConstraints(unitField, gbc); 
     pane.add(unitField); 

     String[] type = {"All", "Verb", "Noun", "Adjective"}; 
     JComboBox<String> comboBox = new JComboBox<String>(type); 
     gbc.gridx = 1; 
     gbc.gridy = 1; 
     gbc.ipadx = 30; 
     gbc.ipady = 10; 
     gbl.setConstraints(comboBox, gbc); 
     pane.add(comboBox); 


     add(pane, BorderLayout.CENTER); 
     setSize(new Dimension(400, 300)); 
     getContentPane().setBackground(Color.WHITE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example(); 
      } 
     }); 
    } 
} 

을, 그것은 모든 구성 요소가 프레임의 중앙에 보인다. 하지만 내가 원하는 것은 :

  1. JLabel (unitLbltypelbl은) 사이의 작은 거리에 각각 두 개의 JLabel의 오른쪽에있을 것입니다
  2. JTextFieldJComboBox 프레임
  3. 의 왼쪽에있을 것입니다.
  4. 또한 격자의 위치 (3,0)에 JButton을 새로 추가하려고하지만이 위치의 높이는 두 개의 JLabel 높이입니다. 즉,이 버튼 높이는 "두 줄"을 의미합니다.

이 목표를 달성하려면 어떻게해야합니까? 도와주세요.

감사합니다 :)

답변

3

당신은 당신의 구성 요소를 정렬 할 셀 내의 위치를 ​​정의하는 GridBagConsraints#anchor를 사용하고 싶습니다.

이 구성 요소가 세포의 수를 이상에 걸쳐 할 수 있도록하려면 사용하려는 GridBagConstraints#gridwidthGridBagConstraints#gridheight (디폴트는 1)이 같은

enter image description here

public class TestLayout09 { 

    public static void main(String[] args) { 
     new TestLayout09(); 
    } 

    public TestLayout09() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new LayoutPane()); 
       frame.setBackground(Color.WHITE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class LayoutPane extends JPanel { 

     public LayoutPane() { 
      Border outline = BorderFactory.createLineBorder(Color.black); 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 

      // I'm not sure this really is what you want, but I may be mistaken 
//   gbc.weighty = 1.0; 
//   gbc.weightx = 1.0; 

      JLabel unitLbl = new JLabel("Unit"); 
      unitLbl.setBorder(outline); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.ipadx = 30; 
      gbc.ipady = 10; 
      gbc.anchor = GridBagConstraints.WEST; 
      add(unitLbl, gbc); 

      JLabel typeLbl = new JLabel("Type"); 
      typeLbl.setBorder(outline); 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      gbc.ipadx = 30; 
      gbc.ipady = 10; 
      add(typeLbl, gbc); 

      JTextField unitField = new JTextField(); 
      typeLbl.setBorder(outline); 
      gbc.gridx = 1; 
      gbc.gridy = 0; 
      gbc.ipadx = 30; 
      gbc.ipady = 10; 
      gbc.anchor = GridBagConstraints.EAST; 
      add(unitField, gbc); 

      String[] type = {"All", "Verb", "Noun", "Adjective"}; 
      JComboBox<String> comboBox = new JComboBox<String>(type); 
      gbc.gridx = 1; 
      gbc.gridy = 1; 
      gbc.ipadx = 30; 
      gbc.ipady = 10; 
      add(comboBox, gbc); 

      JButton btn = new JButton("Test"); 
      gbc.gridx = 3; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.BOTH; 
      gbc.gridheight = 2; 
      add(btn, gbc); 
     } 
    } 
} 
+0

예제의 링크 이미지 (및 [SSCCE] (http : // sscce.org) 물론 –

1

일부 답변 :

은 WEST에 unitlbl의 앵커를 넣습니다.

gbc.anchor = GridBagConstraints.WEST; 

그리고 unitField에서 EAST까지의 앵커.

gbc.anchor = GridBagConstraints.EAST; 

그리고 버튼

는 :

JButton button = new JButton("Test"); 
gbc.fill = GridBagConstraints.VERTICAL; 
gbc.gridx = 3; 
gbc.gridy = 0; 
gbc.gridwidth = 1; 
gbc.gridheight = 2; 
gbc.weighty = 1; 
pane.add(button, gbc); 
4

뭔가 트릭을 수행해야합니다

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Example extends JFrame { 
    public Example() { 
     GridBagLayout gbl = new GridBagLayout(); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JPanel pane = new JPanel(gbl); 
     gbc.anchor = GridBagConstraints.WEST; 

     JLabel unitLbl = new JLabel("Unit"); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(3, 3, 3, 30); 
     gbl.setConstraints(unitLbl, gbc); 
     pane.add(unitLbl); 

     JLabel typeLbl = new JLabel("Type"); 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbl.setConstraints(typeLbl, gbc); 
     pane.add(typeLbl); 

     gbc.weightx = 1.0; 
     gbc.insets = new Insets(3, 3, 3, 3); 

     JTextField unitField = new JTextField(); 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbl.setConstraints(unitField, gbc); 
     pane.add(unitField); 

     String[] type = { "All", "Verb", "Noun", "Adjective" }; 
     JComboBox<String> comboBox = new JComboBox<String>(type); 
     gbc.gridx = 1; 
     gbc.gridy = 1; 
     gbc.fill = GridBagConstraints.NONE; 
     gbl.setConstraints(comboBox, gbc); 
     pane.add(comboBox); 

     final JButton someButton = new JButton("Click me"); 
     someButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(someButton, "You have clicked " + someButton.getText()); 
      } 
     }); 

     gbc.gridx = 3; 
     gbc.gridy = 0; 
     gbc.gridheight = 2; 
     gbc.fill = GridBagConstraints.VERTICAL; 
     pane.add(someButton, gbc); 
     add(pane, BorderLayout.CENTER); 
     setSize(new Dimension(400, 300)); 
     getContentPane().setBackground(Color.WHITE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example(); 
      } 
     }); 
    } 
} 
  • ,210은 (여분의 수평/수직 공간 재분배 방법)
  • 사용 적절한 fill 특성 (수직으로 뻗어 성분 인/가로/모두?)
  • 사용 적절한 anchor 성분이 연신되지 않으면 속성 (또는 최소한 두 방향 모두에서, 어느 쪽이 그 셀 내에 위치해야하는지)
  • 보통 패딩 대신 insets를 사용하기 때문에 ipadx/ipady을 통해 insets을 선호합니다 (구성 요소 주위 또는 구성 요소 내부에 여분의 공백을 추가해야 함))
+0

+1은'weightx/weighty'와'fill'에 대한 설명입니다 – MadProgrammer

관련 문제