2013-11-20 44 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