2016-11-17 1 views
0

Java에서 간단한 프로그램을 만들려고합니다. 그 중 가장 아래쪽에 이 있고 그 바로 아래에 JButton이 있어야합니다. BoxLayout을 사용한 다음 FlowLayout을 시도했지만 프로그램 시작시 JLabels이 사라집니다. button을 클릭하면 모든 것이 올바르게 표시되지만 수동으로 창 크기를 조정해야합니다. 누군가 제가 잘못하고있는 것을 설명 할 수 있습니까? 감사!Java GUI 레이아웃 관련 문제

public class ProgramUI { 
    private JButton _jbutton; 
    private ArrayList<JLabel> _jlabels; 
    private JFrame _jframe; 
    private JPanel _top, _bottom; 

public ProgramUI(){ 
_jframe = new JFrame(); 
_jframe.getContentPane().setLayout(new BoxLayout(_jframe.getContentPane(), BoxLayout.Y_AXIS)); 

_top = new JPanel(); 
_jframe.add(_top); 

_bottom = new JPanel(); 
_jframe.add(_bottom); 

_top.setLayout(new FlowLayout(FlowLayout.LEFT)); 
_bottom.setLayout(new FlowLayout(FlowLayout.LEFT)); 

_jlabels = new ArrayList<JLabel>(); 
for (int i=0; i<8; i++) { 
    JLabel label = new JLabel(); 
    _jlabels.add(label); 
    _top.add(label); 
    //...rest of code is not relevant 
} 

_jbutton = new JButton(); 
    _bottom.add(_jbutton); 

_jframe.pack(); 
_jframe.setVisible(true); 
_jframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
} 

답변

0

나는 FlowLayoutBoxLayout도하지 않는 것이 좋습니다. BoxLayout 은 매우 단순하고 이식성이 없습니다. FlowLayout도 레이아웃이 아니며 매니저입니다. 농담입니다.

내장형 GroupLayout 또는 타사 MigLayout 중 하나를 사용하는 것이 좋습니다. 좋은 레이아웃을 만드는 방법을 배우려면 시간을 할애해야합니다.

여기에 MigLayout의 예가 나와 있습니다.

package com.zetcode; 

import java.awt.EventQueue; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import net.miginfocom.swing.MigLayout; 

public class ProgramUI extends JFrame { 

    public ProgramUI() { 

     initUI(); 
    } 

    private void initUI() { 

     setLayout(new MigLayout("nogrid")); 

     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label")); 
     add(new JLabel("Label"), "wrap"); 
     add(new JButton("Button")); 

     pack(); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null);   
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(() -> { 
      ProgramUI ex = new ProgramUI(); 
      ex.setVisible(true); 
     }); 
    } 
} 

스크린 샷 :

Exampe screenshot