2013-05-07 2 views
1

우아하고 고급스러운 JFrame 레이아웃을 수행하는 방법을 배우려고합니다. 나는 내가 생각하기에 다소 단순 할 수있는 것을 만들려고 노력하고 있지만, 나는 그것에 어려움을 겪고있다. 레이아웃을 작동 시키려고 몇 시간 동안 (내가 이미 가지고 있음에도 불구하고) 어슬렁 거리는 것과는 대조적으로, 나는 내가 묘사하려는 레이아웃에 가장 적합한 컨벤션이 무엇인지 물어볼 것이라고 생각했다.Java 레이아웃 서식 (GridBagLayout)

레이아웃
는 기본적으로, 2 열 싶지만, 첫 번째 열은 두 번째 열보다 넓게. 첫 번째 열에는 셀이 하나만 있으며 해당 셀의 가운데에 아이콘이 붙은 JLabel이 표시됩니다. 두 번째 열은 4 행을 가지며 각각에 JComponent이 있습니다 (상관 없습니다). 또 다른 핵심은 JFrame의 모든 구성 요소가 원하는 크기를 유지하며 셀 또는 사용자의 용도에 맞게 늘리지 않는 것입니다. 지금까지이 두 가지 방법으로 일을 생각했습니다

Desired Layout Picture

:

  1. BorderLayout을의 JLabel -icon에서 여기

    원하는 레이아웃의 사진입니다 나머지 부분을 제어하는 ​​장치는 GridLayout/GridBagLayout입니다.
  2. GridBagLayout 4x4 여기서 JLabel -icon은 이론상 공간의 75 %를 차지하는 3x4 영역을 차지합니다.

내가 원하는 결과를 제공하지 않습니다. 생각/제안? 모든 도움과 제안을 매우 진심으로 감사드립니다.

+0

첫 번째 솔루션이 작동하지 않는 이유는 무엇입니까? 나 한테 잘됐다. – wchargin

+0

크기를 유지하려면'JFrame.setResizable (false) '를 사용하지 않는 것이 어떻습니까? – nullptr

+0

구성 요소의 크기는 유지해야합니다. 예를 들어,'GridLayout' (어쨌든 내 지식에 내가 틀렸다면, 내가 여기있는 이유를 고쳐주십시오)을 사용하면 JButton이 셀의 전체 공간을 차지합니다. 크기에 상관없이 나는 그것을 설정했다. 그게 내가 원하는 걸 그게 아니야. –

답변

2

내 자신의 건강을 위해 일반적으로 레이아웃의 개별 요소를 분리합니다. 이는 중요한 (각 섹션에 대한) 레이아웃 영역에만 집중해야하므로 프로세스를 간소화 할 수 있습니다.

다음 예는 단지 화상과 하나 되었는가 이것은 단지 쉽게 두 JPanels 사용할 수 GridBagLayout

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class AdvancedLayout { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel image; 
     private JButton button; 
     private JLabel label; 
     private JComboBox comboBox; 
     private JButton otherButton; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      image = new JLabel(); 
      button = new JButton("A button"); 
      label = new JLabel("A label"); 
      comboBox = new JComboBox(); 
      otherButton = new JButton("Other"); 
      try { 
       image.setIcon(new ImageIcon(ImageIO.read(new File("/path/to/a/image")))); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.weightx = 0.6666666666666667; 
      gbc.weighty = 1f; 
      gbc.gridheight = GridBagConstraints.REMAINDER; 
      add(image, gbc); 

      gbc.gridheight = 1; 
      gbc.gridx++; 
      gbc.weightx = 0.3333333333333333f; 
      gbc.weighty = 0.25f; 
      add(button, gbc); 
      gbc.gridy++; 
      add(label, gbc); 
      gbc.gridy++; 
      add(comboBox, gbc); 
      gbc.gridy++; 
      add(otherButton, gbc); 

     } 

    } 

} 

의 힘을 입증 한 레이아웃을 사용 옵션.그러면 gridheight을 사용할 필요가 없어집니다.

+0

글쎄, 네가 나를 틀리게 증명 한 것 같아. 그게 바로 제가 찾던 것입니다. 그렇지만 2 개의 JPanels를 사용했다면 어떻게 너비를 지정할 수 있습니까? 2 다른 가중치를 갖는'GridBagLayouts'? –

+0

네, 기본적으로, 왼쪽 패널은 'weightx'가'0.6'이고 오른쪽이 0.3' – MadProgrammer

+0

입니다. 나는 '무게 x'와 '무게'를 간과했다고 믿을 수 없다. 엄청 고마워! –

2

첫 번째 제안은 적절합니다.

레이블의 세로 및 가로 가운데에 레이블을 지정할 수 있습니다.

GridLayout의 경우 기본 그리드 제약 조건이있는 GridBagLayout을 사용하는 JPanel에 각 구성 요소를 추가하는 것이 트릭입니다. 그런 다음 GridLayout에 패널을 추가하십시오. 이제 프레임 크기가 조정되면 패널이 커지지 만 패널의 구성 요소는 확대되지 않으며 구성 요소는 패널의 가운데에 배치됩니다.

다른 하위 패널과 함께 GridLayout을 사용하는 대신 세로 BoxLayout을 사용하고 모든 구성 요소 앞뒤에 "글루"를 추가 할 수도 있습니다. 이 방법으로 모든 구성 요소가 가운데 맞춤을 사용하는지 확인해야합니다. 또한 일부 구성 요소의 최대 크기를 구성 요소의 기본 크기와 같게 설정해야 공간을 사용할 수있을 때 확장되지 않을 수도 있습니다.

+0

+1 나를 때려, 예를 짓고있다 – MadProgrammer

+0

그런 종류의,하지만 그것은 복잡하게 보인다 - 여러 레이아웃 등. –

+1

귀하의 취향에 달려 있습니다. 필자는 이해하기 쉽다고 생각하기 때문에 최소한의 제약 조건으로 여러 레이아웃을 선호합니다. GridBagLayout, GroupLayout 또는 MigLayout과 같은 모든 구성 요소를 사용할 때 단일 레이아웃을 선호하고 여러 조건을 사용하는 사용자도 있습니다. 나는 모든 제약 조건을 이해하기 위해 튜토리얼을 필요로하지 않는다. – camickr