2016-11-17 6 views
0

Ich versuche, ein einfaches Programm in Java, die 8 JLabels auf der Oberseite mit einem JButton direkt darunter zu machen. Ich versuchte mit BoxLayout und dann FlowLayout, aber was passiert, ist die JLabels verschwinden am Anfang des Programms. Wenn auf button geklickt wird, wird alles ordnungsgemäß angezeigt, aber Sie müssen die Größe des Fensters manuell ändern. Könnte jemand erklären, was ich falsch mache? Vielen Dank!Java GUI Layout Probleme

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

Antwort

0

ich nicht weder FlowLayout noch BoxLayout empfehlen. BoxLayout ist sehr einfach und nicht portabel. FlowLayout ist nicht einmal ein Layout Manager, es ist ein Witz.

Ich empfehle, entweder GroupLayout oder MigLayout von Drittanbietern zu verwenden. Sie müssen etwas Zeit widmen, um zu lernen, wie man ein gutes Layout erstellt.

Hier ist Ihr Beispiel mit 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); 
     }); 
    } 
} 

Screenshot:

Exampe screenshot