2017-01-05 20 views
0

私はそれをテストするためにボックスレイアウトを作っていましたが、layout help pageには、整列を与えることができますが、これは私が試したものですが、全く動作しないようです。Boxlayoutは整列していません

package gameflow; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class LoginScreen extends JFrame 
{ 
    private static final Dimension SCREENSIZE = Toolkit.getDefaultToolkit().getScreenSize(); 
    private static final double DEFAULTHEIGHT = (SCREENSIZE.getHeight() * 80)/100; 
    private static final double DEFAULTWIDTH = (SCREENSIZE.getWidth() * 80)/100; 
    private static final long serialVersionUID = -7245840869407664992L; 
    private JTextField userfield = new JTextField(), passfield = new JTextField(); 
    private JLabel userlabel = new JLabel("Username"), passlabel = new JLabel("Password"); 
    private static final Dimension fieldSize = new Dimension(); 

    public LoginScreen() 
    { 
     super("Wraith: the game"); 
     setBounds((SCREENSIZE.width * 10)/100, (SCREENSIZE.height * 10)/100,(int)DEFAULTWIDTH,(int)DEFAULTHEIGHT); 
     fieldSize.setSize((double)this.getWidth()/2,(double)this.getHeight()/30); 

     userfield.setMaximumSize(fieldSize); 
     userfield.setForeground(new Color(1f,1f,1f)); 

     passfield.setMaximumSize(fieldSize); 
     passfield.setForeground(new Color(1f,1f,1f)); 

     userlabel.setMaximumSize(fieldSize); 
     passlabel.setMaximumSize(fieldSize); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
     panel.setBackground(new Color(0f,0f,0f)); 
     panel.setAlignmentX(0.5f); 

     panel.add(userlabel); 
     panel.add(userfield); 
     panel.add(passlabel); 
     panel.add(passfield); 
     this.add(panel, BorderLayout.CENTER); 
    } 
} 

あなたが見るように、PanelはBorderLayoutを持つJFrame内のボックスレイアウトを持ち、コンポーネントは中央に配置されません。どうして?

+0

今のように、すべてのコンポーネントの左端が同じになります。パネル上でsetAlignmentを呼び出すことは個々のコンポーネントに影響を与えません。 – MeBigFatGuy

+0

さて、どうしたらいいですか? – Delupara

+0

私は、フォームのBoxLayout上のSpringLayoutを見ていきたいと思います。またはmiglayout。 https://docs.oracle.com/javase/tutorial/uiswing/layout/spring。htmlの – MeBigFatGuy

答えて

1

まず第一に、あなたが使用する必要があるテキストフィールドを作成する場合:

JTextField textField = new JTextField(10); 

を数は、コンポーネントが約10文字を表示するために適切なサイズを決定することができます。しかし、コンポーネントの実際のサイズは、レイアウトマネージャによって決定されてもよい。

コンポーネントは中央に配置されません。どうして?

これはBoxLayoutのルールです。パネルがJFrameBorderLayoutに追加されると、パネルはフレームの全領域を満たすようにサイズが変更されます。したがって、BoxLayoutは、そのルールに基づいて利用可能なスペースを埋めるためにコンポーネントのサイズを変更することになります。

まず、各コンポーネントがその好ましい高さで表示され、余分なスペースがパネルの下部に追加されます。したがって、すべてのコンポーネントがフレームの上部に表示されます。

コンポーネントをパネルの中央に垂直に配置する場合は、パネルの上部と下部に「接着剤」を追加する必要があります。次に、コンポーネントの上下に空白が追加され、中央に表示されます。 「接着剤」の仕組みの詳細については、チュートリアルのリンクを参照してください。

次のコンポーネントは、パネルの幅を埋めるように水平方向にサイズが変更されます。コンポーネントは最大幅までしか塗りつぶされません。多くのコンポーネント(ラベル、ボタンなど)では、最大幅が好ましい幅ですが、一部のコンポーネント(テキストコンポーネント)には最大幅がありません。使用して、あなたが成長してからテキストフィールドを防ぐことができます

theComponent.setAlignment(0.5f); 

テキストフィールドの場合:

あなたが使用して各コンポーネントの配置を設定する必要が水平にコンポーネントを中央に

textField.setMaximumSize(textField.getPreferredSize()); 

したがって、これらのプロパティを使ってさまざまな効果を試してみてください。

これまで述べてきたように、フレームを中央に配置する最も簡単な方法は、フレームのコンテンツペインでGridBagLayoutを使用することです。次に、コードはちょうど:

setLayout(new GridBagLayout()); 
add(panel, new GridBagConstraints()); 

です。そして、パネルは、好ましいサイズでフレームの中央に配置されます。

関連する問題