1

가능한 경우 창 크기를 조정할 때도 내 창 중앙에 절대 레이아웃을 사용하여 만든 패널을 유지하고 싶습니다. 나는 두 가지 제안을 보았습니다. here과 [여기] [2] 그러나 주사위는 없습니다! 아래 샘플 코드, 아이디어 또는 제안 사항은 무엇입니까? JLable 같은 단일 컴포넌트를 중심으로 문제가 없지만 여러 컴포넌트가있는 패널을 가운데에 배치하고 싶습니다!창 크기가 조정 된 중앙 패널

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.BorderFactory; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.border.Border; 
import javax.swing.JLabel; 


public class TestPanel extends JFrame { 

    private JLabel lblSetupTitle; 
    private Border compoundBorder, outlineColorBorder, outlineBorder; 
    private JTextArea txtrManageData; 
    private JPanel childPanel; 

    public TestPanel() 
    { 
     setBackground(Color.white); 
     outlineColorBorder = BorderFactory.createLineBorder(Color.gray); 
     outlineBorder = BorderFactory.createEmptyBorder(20, 20, 20, 20); 
     compoundBorder = BorderFactory.createCompoundBorder(outlineColorBorder, outlineBorder); 

     lblSetupTitle = new JLabel("Setup"); 
     lblSetupTitle.setBounds(443, 288, 44, 23); 
     txtrManageData = new JTextArea("Text Area Text"); 
     txtrManageData.setBounds(393, 322, 142, 61); 

     childPanel = new JPanel(); 
     childPanel.setLocation(89, 38); 
     childPanel.setSize(921, 452); 
     childPanel.setBorder(compoundBorder); 

     setupGUIElements(); 
     setupPanel(); 
    } 

    private void setupGUIElements() 
    { 
     txtrManageData.setBackground(null); 
     txtrManageData.setLineWrap(true); 
     txtrManageData.setWrapStyleWord(true); 
    } 

    private void setupPanel() 
    { 
     getContentPane().setLayout(new GridBagLayout()); // set layout of parent panel to GridBagLayout 
     childPanel.setLayout(null); // set layout of child panel to AbsoluteLayout 
     childPanel.add(lblSetupTitle); 
     childPanel.add(txtrManageData); 

     getContentPane().add(childPanel, new GridBagConstraints()); 

     this.setSize(1020, 500); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       TestPanel ex = new TestPanel(); 
       ex.setVisible(true); 
      } 
     }); 
    } 
} 

편집 : 코드이

example gui i would like to create

+2

enter image description here는 널 (null) 'LayoutManager'를 사용하지 마십시오. – alex2410

+4

BorderLayout 또는 GrudBagLayout은 절대 레이아웃을 사용하여 버스트 실수를 무료로 수행합니다. 이 작업은 지루하고, 진지하고, 반복적 인 작업을 처리하기 위해 레이아웃 관리자가있는 이유 중 하나입니다. – MadProgrammer

+0

아 .. 그리고 'txtrManageData = new JTextArea ("텍스트 영역 텍스트 "); 대신'txtrManageData = new JTextArea ("텍스트 영역 텍스트 ", 3, 20); –

답변

2

레이아웃을 중첩했습니다. enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.TitledBorder; 

public class ThreeButtonTextFieldCombo { 

    private JPanel ui = null; 

    ThreeButtonTextFieldCombo() { 
     initUI(); 
    } 

    public final void initUI() { 
     if (ui!=null) return; 
     ui = new JPanel(new GridBagLayout()); 
     ui.setBorder(new TitledBorder("Parent Panel")); 

     JPanel controls = new JPanel(new GridLayout(1,0,10,10)); 
     ui.add(controls); 
     controls.setBackground(Color.RED); 
     controls.setBorder(new TitledBorder("Child Panel")); 

     for (int ii=1; ii<4; ii++) { 
      addLabelAndField(controls, "String " + ii); 
     } 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    private void addLabelAndField(JPanel panel, String text) { 
     JPanel controls = new JPanel(new BorderLayout(3, 3)); 
     controls.setBorder(new EmptyBorder(20,20,20,20)); 
     JLabel l = new JLabel(text); 
     controls.add(l, BorderLayout.PAGE_START); 

     JTextArea ta = new JTextArea(text, 2, 8); 
     controls.add(new JScrollPane(ta)); 

     panel.add(controls); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame("Three Button/Text Field Combo"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 
       ThreeButtonTextFieldCombo tbtfc = 
         new ThreeButtonTextFieldCombo(); 
       f.setContentPane(tbtfc.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 
       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

OK .. 버튼/라벨, 라벨/버튼이 조금 섞여 있지만 버튼 라벨을 바꾸면 똑같이 작동합니다. –

0

첫 번째 문제 같은 것을 만드는 방법에 대한 모든 팁, 링크, 지침은의 GridBagConstraints의 빈 인스턴스를 사용하여 하위 패널을 추가하는 것입니다. 나는 그걸 전에 그렇게 사용하는 걸 한번도 보지 못했습니다.

getContentPane().add(childPanel, new GridBagConstraints()); 

콘텐츠 창으로 어떤 레이아웃을 설정하고 단지 다음과 같이 추가하지 마십시오 : 당신은 당신이를 사용하여 정의 된 중간에 두 개의 구성 요소를 얻을 것이다 그것을 실행하면 이제

getContentPane().add(childPanel); 

setBounds (..) 메소드.

거의 모든 사람이 질문에 댓글을 달았으므로 null 레이아웃을 사용하지 말고 다른 레이아웃을 사용하십시오. GridBagLayout을 사용하여 다이어그램에서 세 개의 버튼과 세 개의 텍스트 필드를 구성 할 수 있습니다. 그런 다음 하위 패널에서 경계 (..)를 설정할 수 있습니다.

절대 레이아웃을 꼭 사용해야하는 경우 수학을 조금씩 수행해야합니다.

첫 번째 레이블이 같은 경우 :

labell2.setBounds(443 + someXDisplacement, 288, 44, 23); 

.. 그리고 셋째 : 당신이 얻을

labell3.setBounds(443 + (someXDisplacement x 2), 288, 44, 23); 

labell1.setBounds(443, 288, 44, 23); 

다음 두 번째 라벨은 다음과 같이해야한다 사진.

+2

* "정말로 절대 레이아웃을 사용해야하는 경우 .."* 지옥이 얼어 붙었을 때 절대 레이아웃이 필요합니다. * –

+0

OP가 원하는 부분에 정확히 대답하기 위해 downvoted하는 것이 좋습니다. 절대적으로 AbsoluteLayout을 사용하지 말 것을 권유하지만, 사용해야 할 경우 제안을하십시오. 때때로 SO는 농담입니다. –

+0

* "좋은 downvoted .."* 내려 투표 날 보지 마. 그러나 .. * ".. OP가 원하는 것을 정확히 대답하기 위해서."*. 나는 이것이 실수라고 생각한다. –

관련 문제