2013-11-20 45 views
8

我正在顯示一個揮杆JPanel中的鍵值對列表。該鍵顯示在JLabel中,並且該值顯示在JTextField中。面板上有足夠的空間顯示1或2列鍵值對,具體取決於父JFrame的大小。我想顯示2列鍵值對,除非面板太小。然後我想切換到一列。在沒有編寫我自己的自定義佈局管理器的情況下,這可能在Swing中嗎如何在Java Swing中創建響應式佈局

將每個鍵值對放在它自己的面板上,並將面板添加到Flow Layout中將會做我想做的事情,除非標籤不會彼此對齊,並且文本字段不會彼此對齊,所以它會看起來很糟糕。有一個更好的方法嗎?

編輯:

這是它會是什麼樣子。如果面板足夠大,則顯示兩列。否則顯示一列。

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