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);}
}
:이 레이아웃, 여기처럼 보이는 그것이 무엇인지 궁금해 사람들을위한
. 결국이 코드를 클래스로 리팩토링하려는 시도에 대해 질문해야합니다. 결국 리팩토링이 미래에 무수히 많은 시간을 할애해야하기 때문입니다. 이것은 당신이 그것을 연습 할 수있는 좋은 기회입니다, 그래서 나는 당신이 그것에 대한 또 다른 시도를하고 당신의 디자인에 관한 구체적인 질문으로 돌아올 것을 제안합니다. –
@Shakedown 리팩토링에 대한 구체적인 접근 방식을 제안 할 수 있습니까? – CodeMed
일부 구성 요소의 최대 크기를 명시 적으로 설정하는 방법을 볼 수 있으므로 나머지 구성 요소가 크기 조정이 완료 될 때를 포함하여 사용 가능한 모든 공간을 채 웁니다.그러나 나는 명시적인 크기의 지시가 권장되지 않는다는 인상하에 있으며 누군가 GridBagLayout과 같은 동적 인 접근 방식을 사용하거나 뭔가 다른 것을 보여줄 수 있기를 바랬다. – CodeMed