2011-09-22 7 views
4

GridBagLayout 및 GridBagConstraints를 사용하여 GUI를 설계했습니다. 가변 개수의 행을 포함하며 각 열 레이아웃은 가능한 몇 가지 열 레이아웃 중 하나입니다. 코드를 테스트하기 위해 각 행과 열에있는 모든 셀의 위치와 크기 조정 동작을 보여주는 다양한 색상의 패널 GUI를 구성했습니다. 이 테스트 GUI는 정상적으로 작동하지만 이제는 구성을 자동화해야합니다. 특히 행이 세 가지 유형 중 하나가되어야합니다. 아래 코드를 실행하여 결과 GUI를 보면 row1이 하나의 유형이고 행 2,6,7이 다른 유형이고 행 3,4,5가 아직 세 번째 유형이라는 것을 알 수 있습니다. 이 세 가지 유형의 행을 각각 자체 클래스에 캡슐화해야합니다. 게다가, 제 3 타입의 가변 개수의 행을 생성 할 수 있도록 코드가 필요합니다 (이 예에서 3,4, 5 행으로 표시). (데이터 분석 소프트웨어 용입니다.) 패널은 데이터보기를 조작하기위한 데이터보기 및 도구를로드합니다.Java GridBagLayout 자동 생성

행을 자체 클래스로 캡슐화하면 GUI가 보이지 않게됩니다. 아래의 테스트 코드는 GUI 레이아웃을 보여야한다. 누구든지이 코드를 변경하여 위의 첫 번째 단락에 설명 된 기능을 갖도록 표시 할 수 있습니까?

바로 아래에서 테스트 코드를 IDE에 붙여 넣으면 바로 사용할 수 있습니다.

GridBagLayoutDemo.java의 코드는 다음과 같습니다 : 다음과 같이 테스트 코드는 두 개의 별도의 파일에

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

public class GridBagLayoutDemo { 
    final static boolean RIGHT_TO_LEFT = false; 

    public static void addComponentsToPane(Container pane) { 
     if (RIGHT_TO_LEFT) {pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);} 
     pane.setLayout(new GridBagLayout()); 

// top row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr1c1 = new TestPanel(Color.black); 
     GridBagConstraints constraint_r1c1 = getGridBagConstraints(GridBagConstraints.NONE,0,0,1,0,0,0); 
     pane.add(panelr1c1,constraint_r1c1); 

     TestPanel panelr1c2 = new TestPanel(Color.blue); 
     GridBagConstraints constraint_r1c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,0,1,0.8,0,0); 
     pane.add(panelr1c2,constraint_r1c2); 

     TestPanel panelr1c2a = new TestPanel(Color.green); 
     GridBagConstraints constraint_r1c2a = getGridBagConstraints(GridBagConstraints.HORIZONTAL,2,0,1,0.8,0,0); 
     pane.add(panelr1c2a,constraint_r1c2a); 

     TestPanel panelr1c3 = new TestPanel(Color.red); 
     GridBagConstraints constraint_r1c3 = getGridBagConstraints(GridBagConstraints.NONE,3,0,1,0,0,0); 
     pane.add(panelr1c3,constraint_r1c3); 

     TestPanel panelr1c4 = new TestPanel(Color.blue); 
     GridBagConstraints constraint_r1c4 = getGridBagConstraints(GridBagConstraints.NONE,4,0,1,0,0,0); 
     pane.add(panelr1c4,constraint_r1c4); 

// second row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr2c1 = new TestPanel(Color.magenta); 
     GridBagConstraints constraint_r2c1 = getGridBagConstraints(GridBagConstraints.NONE,0,1,1,0,0,0); 
     pane.add(panelr2c1,constraint_r2c1); 

     TestPanel panelr2c2 = new TestPanel(Color.pink); 
     GridBagConstraints constraint_r2c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,1,2,1.0,0,0); 
     pane.add(panelr2c2,constraint_r2c2); 

     TestPanel panelr2c3 = new TestPanel(Color.black); 
     GridBagConstraints constraint_r2c3 = getGridBagConstraints(GridBagConstraints.NONE,3,1,1,0,0,0); 
     pane.add(panelr2c3,constraint_r2c3); 

     TestPanel panelr2c4 = new TestPanel(Color.pink); 
     GridBagConstraints constraint_r2c4 = getGridBagConstraints(GridBagConstraints.NONE,4,1,1,0,0,0); 
     pane.add(panelr2c4,constraint_r2c4); 

// third row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr3c1 = new TestPanel(Color.gray); 
     GridBagConstraints constraint_r3c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,2,1,0,0.5,40); 
     pane.add(panelr3c1,constraint_r3c1); 

     TestPanel panelr3c2 = new TestPanel(Color.orange); 
     GridBagConstraints constraint_r3c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,2,2,1.0,0.5,40); 
     pane.add(panelr3c2,constraint_r3c2); 

     TestPanel panelr3c3 = new TestPanel(Color.red); 
     GridBagConstraints constraint_r3c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,2,1,0,0.5,40); 
     pane.add(panelr3c3,constraint_r3c3); 

     TestPanel panelr3c4 = new TestPanel(Color.orange); 
     GridBagConstraints constraint_r3c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,2,1,0,0.5,40); 
     pane.add(panelr3c4,constraint_r3c4); 

// fourth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr4c1 = new TestPanel(Color.black); 
     GridBagConstraints constraint_r4c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,3,1,0,0.5,40); 
     pane.add(panelr4c1,constraint_r4c1); 

     TestPanel panelr4c2 = new TestPanel(Color.white); 
     GridBagConstraints constraint_r4c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,3,2,1.0,0.5,40); 
     pane.add(panelr4c2,constraint_r4c2); 

     TestPanel panelr4c3 = new TestPanel(Color.green); 
     GridBagConstraints constraint_r4c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,3,1,0,0.5,40); 
     pane.add(panelr4c3,constraint_r4c3); 

     TestPanel panelr4c4 = new TestPanel(Color.blue); 
     GridBagConstraints constraint_r4c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,3,1,0,0.5,40); 
     pane.add(panelr4c4,constraint_r4c4); 

// fifth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr5c1 = new TestPanel(Color.darkGray); 
     GridBagConstraints constraint_r5c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,4,1,0,0.5,40); 
     pane.add(panelr5c1,constraint_r5c1); 

     TestPanel panelr5c2 = new TestPanel(Color.yellow); 
     GridBagConstraints constraint_r5c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,4,2,1.0,0.5,40); 
     pane.add(panelr5c2,constraint_r5c2); 

     TestPanel panelr5c3 = new TestPanel(Color.white); 
     GridBagConstraints constraint_r5c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,4,1,0,0.5,40); 
     pane.add(panelr5c3,constraint_r5c3); 

     TestPanel panelr5c4 = new TestPanel(Color.orange); 
     GridBagConstraints constraint_r5c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,4,1,0,0.5,40); 
     pane.add(panelr5c4,constraint_r5c4); 

// sixth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr6c1 = new TestPanel(Color.green); 
     GridBagConstraints constraint_r6c1 = getGridBagConstraints(GridBagConstraints.NONE,0,5,1,0,0,0); 
     pane.add(panelr6c1,constraint_r6c1); 

     TestPanel panelr6c2 = new TestPanel(Color.blue); 
     GridBagConstraints constraint_r6c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,5,2,1.0,0,0); 
     pane.add(panelr6c2,constraint_r6c2); 

     TestPanel panelr6c3 = new TestPanel(Color.red); 
     GridBagConstraints constraint_r6c3 = getGridBagConstraints(GridBagConstraints.NONE,3,5,1,0,0,0); 
     pane.add(panelr6c3,constraint_r6c3); 

     TestPanel panelr6c4 = new TestPanel(Color.black); 
     GridBagConstraints constraint_r6c4 = getGridBagConstraints(GridBagConstraints.NONE,4,5,1,0,0,0); 
     pane.add(panelr6c4,constraint_r6c4); 

// seventh row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0) 
     TestPanel panelr7c1 = new TestPanel(Color.darkGray); 
     GridBagConstraints constraint_r7c1 = getGridBagConstraints(GridBagConstraints.NONE,0,6,1,0,0,0); 
     pane.add(panelr7c1,constraint_r7c1); 

     TestPanel panelr7c2 = new TestPanel(Color.white); 
     GridBagConstraints constraint_r7c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,6,2,1.0,0,0); 
     pane.add(panelr7c2,constraint_r7c2); 

     TestPanel panelr7c3 = new TestPanel(Color.yellow); 
     GridBagConstraints constraint_r7c3 = getGridBagConstraints(GridBagConstraints.NONE,3,6,1,0,0,0); 
     pane.add(panelr7c3,constraint_r7c3); 

     TestPanel panelr7c4 = new TestPanel(Color.green); 
     GridBagConstraints constraint_r7c4 = getGridBagConstraints(GridBagConstraints.NONE,4,6,1,0,0,0); 
     pane.add(panelr7c4,constraint_r7c4); 
    } 

    // Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread. 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("GridBagConstraint Practice"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //Set up the content pane. 
     addComponentsToPane(frame.getContentPane()); 
     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() {createAndShowGUI();}}); 
    } 
    private static GridBagConstraints getGridBagConstraints(int fill, int gridx, int gridy, int gridwidth, double weightx, double weighty, int ipady){ 
     GridBagConstraints myGridBagConstraints = new GridBagConstraints(); 
      myGridBagConstraints.fill=fill; 
     myGridBagConstraints.gridx=gridx; 
     myGridBagConstraints.gridy=gridy; 
     myGridBagConstraints.gridwidth=gridwidth; 
     myGridBagConstraints.weightx=weightx; 
     myGridBagConstraints.weighty=weighty; 
     myGridBagConstraints.ipady=ipady; 
     return myGridBagConstraints; 
    } 
} 

TestPanel.java의 코드는 다음과 같습니다

import java.awt.Color; 
import javax.swing.JPanel; 

public class TestPanel extends JPanel { 
    public TestPanel (Color myColor){this.setBackground(myColor);} 
} 
+1

:이 레이아웃, 여기처럼 보이는 그것이 무엇인지 궁금해 사람들을위한

. 결국이 코드를 클래스로 리팩토링하려는 시도에 대해 질문해야합니다. 결국 리팩토링이 미래에 무수히 많은 시간을 할애해야하기 때문입니다. 이것은 당신이 그것을 연습 할 수있는 좋은 기회입니다, 그래서 나는 당신이 그것에 대한 또 다른 시도를하고 당신의 디자인에 관한 구체적인 질문으로 돌아올 것을 제안합니다. –

+0

@Shakedown 리팩토링에 대한 구체적인 접근 방식을 제안 할 수 있습니까? – CodeMed

+0

일부 구성 요소의 최대 크기를 명시 적으로 설정하는 방법을 볼 수 있으므로 나머지 구성 요소가 크기 조정이 완료 될 때를 포함하여 사용 가능한 모든 공간을 채 웁니다.그러나 나는 명시적인 크기의 지시가 권장되지 않는다는 인상하에 있으며 누군가 GridBagLayout과 같은 동적 인 접근 방식을 사용하거나 뭔가 다른 것을 보여줄 수 있기를 바랬다. – CodeMed

답변

4

규칙 번호 1 스윙 레이아웃 : 무엇을 하든지 GridBagLayout을 사용하지 마십시오. GridBagLayout은 1998 년에 좋았습니다. 그 디자인은 문제가 있고, 버그이며, 진화하지 않았습니다. 코드는 매우 자세하고 작성하기가 어렵고 이해하기 어렵고 유지하기가 어렵습니다.

내가보기에 가장 다재다능하고 직관적 인 레이아웃 관리자 인 MigLayout을 권장합니다. MigLayout 사이트의 퀵 스타트 가이드를 보면 GridBagLayout보다 훨씬 덜 어렵고 훨씬 강력합니다. 여기에 귀하의 예는 MigLayout에서이고 나는 당신의 행 유형을 리팩토링하는 방법을 표시했습니다

import net.miginfocom.swing.MigLayout; 
import java.awt.*; 
import javax.swing.*; 

public class GridBagLayoutDemo { 
    final static boolean RIGHT_TO_LEFT = false; 

    public static void addComponentsToPane(Container pane) { 
     if (RIGHT_TO_LEFT) { 
      pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     } 
     pane.setLayout(new MigLayout("insets 0, gap 0, wrap", "[][fill, grow][fill, grow][][]", "[fill]")); 

     addType1(pane, Color.BLACK, Color.BLUE, Color.GREEN, Color.RED, Color.BLUE); 
     addType2(pane, Color.MAGENTA, Color.PINK, Color.BLACK, Color.PINK); 
     addType3(pane, Color.GRAY, Color.ORANGE, Color.RED, Color.ORANGE); 
     addType3(pane, Color.BLACK, Color.WHITE, Color.GREEN, Color.BLUE); 
     addType3(pane, Color.DARK_GRAY, Color.YELLOW, Color.WHITE, Color.ORANGE); 
     addType2(pane, Color.GREEN, Color.BLUE, Color.RED, Color.BLACK); 
     addType2(pane, Color.DARK_GRAY, Color.WHITE, Color.YELLOW, Color.GREEN); 
    } 

    private static void addType1(Container pane, Color c1, Color c2, Color c3, Color c4, Color c5) { 
     pane.add(new TestPanel(c1)); 
     pane.add(new TestPanel(c2)); 
     pane.add(new TestPanel(c3)); 
     pane.add(new TestPanel(c4)); 
     pane.add(new TestPanel(c5)); 
    } 

    private static void addType2(Container pane, Color c1, Color c2, Color c3, Color c4) { 
     pane.add(new TestPanel(c1)); 
     pane.add(new TestPanel(c2), "spanx 2"); 
     pane.add(new TestPanel(c3)); 
     pane.add(new TestPanel(c4)); 
    } 

    private static void addType3(Container pane, Color c1, Color c2, Color c3, Color c4) { 
     pane.add(new TestPanel(c1)); 
     pane.add(new TestPanel(c2), "spanx 2, pushy, hmin pref+40"); 
     pane.add(new TestPanel(c3)); 
     pane.add(new TestPanel(c4)); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("MigLayout Practice"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     addComponentsToPane(frame.getContentPane()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

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

class TestPanel extends JPanel { 
    public TestPanel(Color myColor) { 
     this.setBackground(myColor); 
    } 
} 

이 당신의 예제와 동일한 레이아웃을 얻을 수 있습니다. 아마도 hmin pref+40 대신 hmin 40을 원할 것입니다. 후자는 GridBagConstraints에서 ipady = 40을 설정하는 것과 같은 결과를 생성합니다.

그리고 Color 클래스의 대문자 상수를 사용하십시오. 소문자 상수는 더 이상 사용하지 말아야합니다. 당신은 물어 좋은 질문이 있어요,하지만 당신은 바로 하나를 요구하지 않는

enter image description here

+0

시간을내어 주셔서 대단히 감사합니다. 그러나 MigLayout을 사용하여 코드에 다른 종속성을 추가했음을 알았습니다. 코드에 추가 종속성을 추가하지 않고이 작업을 수행하는 방법을 알고 있습니까? Java와 함께 제공되는 도구 만 사용하면됩니까? – CodeMed

+0

JRE에는 다른 레이아웃 관리자가 있지만 MigLayout과 다른 레이아웃 관리자는 없습니다. MigLayout JAR 파일은 76kB에 불과합니다. 물론 GBL 코드를 비슷한 방법으로 리펙토링 할 수도 있습니다. –

+1

감사합니다. 나는 GBL 코드를 리팩터링하여 90 줄의 코드만으로이 게시물을 시작할 때 요청한 모든 작업을 완료했습니다. 이런 식으로, 나는 내 코드에 다른 의존성을 추가 할 필요가 없었다. 그러나, 나는 당신의 대답을 답으로 표시하고 당신에게 +1로 투표함으로써 더 많은 점수를 얻습니다. 도와 주려고 너무 많은 시간을 할애 해 주셔서 감사드립니다. – CodeMed