Java GUI布局问题

时间:2016-11-17 18:03:45

标签: java user-interface jpanel jlabel layout-manager

我试图在Java中创建一个简单的程序,其顶部需要8 JLabels,其下方只有一个JButton。我尝试使用BoxLayout然后使用FlowLayout,但会发生的是JLabels在程序开始时消失。单击button时,所有内容都会正确显示,但您必须手动调整窗口大小。有人可以解释我做错了什么吗?谢谢!

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);
} 

1 个答案:

答案 0 :(得分:0)

我既不推荐FlowLayout也不推荐BoxLayoutBoxLayout 非常简单和不便携。 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