2017-03-14 4 views
0

Java에서 Swing 구성 요소를 사용하여 간단한 GUI를 만들려고합니다. 그러나 일부 구성 요소는 다른 구성 요소의 크기로 인해 중앙에서 벗어납니다. GridBagConstraints.CENTER를 사용하여 이러한 구성 요소를 중앙에 배치했지만 내부에 포함 된 Grid 셀에 대해서만 중심에 배치하는 것으로 보입니다.Java에서 GridBagLayout을 사용할 때 스윙 구성 요소가 중심에서 벗어나지 않게하기

내가 가진 특정 문제는 아래에 그려져 있습니다. "File Name :"옆에 JTextField가 있어야 특정 길이가됩니다. 그러나 이것을 일정 길이로 만들면 다른 행의 다른 구성 요소가 중심에서 벗어나게됩니다. 모든 구성 요소를 가운데 맞춤으로 유지하는 유일한 방법은 두 JTextField가 동일한 길이가되도록하는 것입니다.

저는 Swing과 Java GUI에 일반적으로 익숙하지 않으므로 몇 가지 기본 개념이 빠져 있을지 모르지만 아직 내 검색에서이 특정 질문에 대한 답변을 찾지 못했습니다. gbc.fillNone 경우

Image Showing the Components becoming Off-Centered when the JTextField length changes

>

//Initialize global Swing objects 
JFrame frame = new JFrame("Game Server V2.0 build 019827427"); 
JPanel panel = new JPanel(); 
JButton runButton = new JButton("Start Server"); 
JButton stopButton = new JButton("Stop Server"); 
JButton sendButton = new JButton("Send File"); 
JTextField portField = new JTextField("999", 5); 
JTextField fileField = new JTextField("fileToSend.txt", 14); 
JLabel portLabel = new JLabel("Port: "); 
JLabel fileLabel = new JLabel("File Name: "); 
JLabel statusLabel = new JLabel("Status: Disconnected"); 

public void run(){ 

    //Set layout and constraints 
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints gc = new GridBagConstraints(); 

    //Add Swing components to panel using GridBagLayout with the GridBagConstraints we've specified 
    gc.weightx = 0.5; 
    gc.weighty = 0.5; 

    gc.gridx = 0; 
    gc.gridy = 0; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_END; 
    panel.add(portLabel, gc); 

    gc.gridx = 1; 
    gc.gridy = 0; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_START; 
    panel.add(portField, gc); 

    gc.gridx = 0; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_END; 
    panel.add(fileLabel, gc); 

    gc.gridx = 1; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_START; 
    panel.add(fileField, gc); 

    gc.gridx = 0; 
    gc.gridy = 2; 
    gc.gridwidth = 2; 
    gc.anchor = GridBagConstraints.CENTER; 
    panel.add(sendButton, gc); 

    gc.gridx = 0; 
    gc.gridy = 3; 
    gc.gridwidth = 1; 
    panel.add(runButton, gc); 

    gc.gridx = 1; 
    gc.gridy = 3; 
    gc.gridwidth = 1; 
    panel.add(stopButton, gc); 

    gc.gridx = 0; 
    gc.gridy = 4; 
    gc.gridwidth = 2; 
    panel.add(statusLabel, gc); 

    frame.add(panel); 
    frame.setSize(480, 280); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

} 
+0

GridBagContraints.CENTER는 셀의 구성 요소 중심을 (수직 및 수평으로) 가운데 맞추기 위해 설계되었습니다. –

+0

frame.setSize를'frame.pack()'으로 대체해야합니다. GridBagLayout에 컴포넌트 레이아웃을위한 충분한 공간이 없습니다. – VGR

+0

'하지만 그 안에 포함 된 그리드 셀에 대해서만 중심을 유지하는 것 같습니다. - 올바른, 구성 요소는 셀 내에 배치됩니다. 나는 당신에게 "중심"이 무엇을 의미하는지 모르겠습니다. 구성 요소를 표시하는 방법을 보여주는 ascii 다이어그램을 그립니다. 셀의 왼쪽 가장자리에 "시작"단추가 표시되고 오른쪽 가장자리에 "중지"단추가 표시되기를 원할 수도 있습니다. – camickr

답변

0

,

그래서 당신은 "시작이 있어야합니다 "및"중지 "버튼을 클릭하십시오. 그런 다음 확장 할 수 있도록 1.0의 가중치가 있어야합니다. 그들은 중심에 있어야합니다.

참고 : 시작 버튼의 너비가 중지 버튼보다 약간 크기 때문에 공백이 너무 적어지기 때문에 정확히 가운데 맞춤을 사용하지 않습니다.

다른 모든 데이터 행의 경우 각 행에 단일 구성 요소를 추가해야합니다. 그런 다음 각 구성 요소는 2 개의 gridwidth가 필요합니다. 각 구성 요소는 가운데에 배치됩니다. 처음 두 행에는 두 개의 구성 요소가 포함되어 있으므로 패널을 만들고 패널에 구성 요소를 추가해야합니다. 그런 다음 GridBagLayout을 사용하여 패널을 패널에 추가합니다.

0

gbc.gridweightxgbc.gridweighty는 아무 의미가 없다. 필드 만 추가 공간을 받아야한다 (fill == HORIZONTAL and weightx != 0)

나는 내가 정말 원하는하고있어 동일한 폭으로 세포의 두 열에 대한 추측
+0

당신이 말하는 것은 사실이 아닙니다. 구성 요소에 여분의 공간을주고 제한 조건의 기준을 수정하면 구성 요소가 일부 위치에 표시되지 않습니다. –

+0

당신은 맞습니다.하지만 그것은 일반적으로 원하는 것이 아닙니다.나는 "의미 없음"대신 "사용하지 말라"고 말 했어야했다. –

관련 문제