2013-11-20 24 views
8

スイングJPanelにキー値のペアのリストを表示しています。キーはJLabelに表示され、値はJTextFieldに表示されます。親JFrameの大きさに応じて、キー値ペアの1列または2列を表示するのに十分な余裕がパネルにあります。パネルが小さすぎる場合を除き、2列のキー値ペアを表示したいと思います。次に、1つの列に切り替える必要があります。私自身のカスタムレイアウトマネージャーを書かずにスイングでこれは可能ですか?Java Swingでレスポンシブなレイアウトを作成するには

各キー値ペアを自分のパネルに配置し、フローレイアウトにパネルを追加すると、ラベルが互いに整列されず、テキストフィールドが互いに整列しないようにすることができますひどく見えるこれを行うより良い方法はありますか?

編集:ここでは

は、それがどのように見えるかです。パネルの大きさが十分な場合は、2つの列を表示します。それ以外の場合は1つの列を表示する

2列:

Some Key _______________    Key 2 ________________ 
Another Key _______________  Yet Another Key ________________ 
     Key 5 _______________    Key 6 ________________ 

1列

 Some Key _______________     
      Key 2 _______________ 
    Another Key _______________  
Yet Another Key _______________ 
      Key 5 _______________     
      Key 6 ________________ 
+0

1)余分な幅/高さと、それは最小サイズで表示されなければならないとして、GUI(サイズ変更可能ならば)のASCIIアートを提供します。 2)*レイアウトを組み合わせて必要なレイアウトを作成する方法については、[ネストされたレイアウトの例](http://stackoverflow.com/a/5630271/418556)を参照してください。 –

+0

@Andrew Thompson私が質問で示した例は、レイアウトを組み合わせた例でした。 –

+0

[この回答](http://stackoverflow.com/a/16353404/418556)のように 'GroupLayout'を使用することができます。他の解決策 'GroupLayout'がありますが、それを最初に見てください。 –

答えて

3

あなたはFlowLayoutのアイデアを使用して、まだラベル/テキストフィールドのラインナップを作ることができます。最も長いラベルのサイズである各キー/値パネルにストラットを追加して、各パネルのテキストフィールドを同じ量だけ右に押し出します。以下のような何か:

import java.awt.*; 
import javax.swing.*; 

public class Test implements Runnable 
{ 
    private String[] keys = {"One", "Twoooooo", "Three", "Four", 
          "Five", "Six", "Seven", "Eight", 
          "Nine", "Ten", "Eleven", "Twelve"}; 
    private String[] values = {"Apple", "Boy", "Cat", "Denmark", 
          "Elephant", "Foo", "Hello", "Igloo", 
          "Jug", "Kangaroo", "Lip", "Now"}; 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Test()); 
    } 

    public void run() 
    { 
    JPanel panel = new JPanel(new FlowLayout()); 
    GridBagConstraints gbc; 
    JTextField textField = null; 
    int maxWidth = 0; 
    JLabel[] labels = new JLabel[keys.length]; 

    for (int i = 0; i < keys.length; i++) 
    { 
     labels[i] = new JLabel(keys[i]); 
     maxWidth = Math.max(labels[i].getPreferredSize().width, maxWidth); 
    } 

    JPanel[] panels = new JPanel[keys.length]; 

    for (int i = 0; i < keys.length; i++) 
    { 
     panels[i] = new JPanel(new GridBagLayout()); 

     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.insets = new Insets(1,1,1,1); 
     panels[i].add(Box.createHorizontalStrut(maxWidth), gbc); 

     gbc.gridy = 1; 
     panels[i].add(labels[i], gbc); 

     textField = new JTextField(10); 
     textField.setText(values[i]); 
     gbc.gridx = 1; 
     panels[i].add(textField, gbc); 

     panel.add(panels[i]); 
    } 

    JFrame frame = new JFrame("Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(panel); 
    frame.setSize(240, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 
} 
+0

私は数年前からSwingの開発を行っていないので、もっと新しいものがあるかもしれませんが、MigLayout - http://www.miglayout.comはこれをもっと簡単にします。 – GreyBeardedGeek

+0

@GreyBeardedGeek Migの大ファンではありません。私はここにいるいくつかの指導者がそれを誓うことを知っているので、そのメリットがあると確信しています。通常、私がGBLコードを実行すると、私が書いたヘルパークラスを使用して、ここに表示されているGBLコードのほとんどを削除します。 – splungebob

関連する問題