2016-11-17 3 views
0

私は、Javaの単純なプログラムを作成しようとしています。これには、上に8個のJLabelsと、そのすぐ下にJButtonが必要です。 BoxLayoutFlowLayoutを使ってみましたが、プログラムの開始時に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

でもBoxLayoutでもおすすめしません。 BoxLayout は非常に単純でポータブルではありません。 FlowLayoutはレイアウトでもない マネージャー、それは冗談です。

またはサードパーティの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