2013-11-20 6 views
8

Я показываю список пар ключевых значений в swan JPanel. Ключ отображается в JLabel, и значение отображается в JTextField. На панели достаточно места для отображения 1 или 2 столбцов пар значений ключа в зависимости от того, насколько большой родительский JFrame. Я бы хотел отобразить 2 столбца пары ключевых значений, если панель не станет слишком маленькой. Затем я хочу переключиться на один столбец. Возможно ли это в Swing без написания моего собственного менеджера компоновки?Как создать отзывчивый макет в Java Swing

Помещение каждой пары значений ключей на собственную панель и добавление панелей в макет потока будет делать то, что я хочу сделать, за исключением того, что метки не будут выровнены друг с другом, а текстовые поля не будут выравниваться друг с другом, чтобы выглядят ужасно. Есть лучший способ сделать это?

Edit:

Вот что это будет выглядеть. Если панель достаточно большая, отобразите две колонки. В противном случае отобразите один столбец.

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) Предоставьте ASCII-графику графического интерфейса пользователя, поскольку он должен отображаться в наименьшем размере и (при изменении размера) с дополнительной шириной/высотой. 2) См. Пример [Вложенный макет] (http://stackoverflow.com/a/5630271/418556) для представления о том, как * объединить * макеты для создания требуемого макета. –

+0

@Andrew Thompson Пример, который я дал в вопросе, был примером объединения макетов. –

+0

Вы можете использовать 'GroupLayout', как показано в [этом ответе] (http://stackoverflow.com/a/16353404/418556). Существуют и другие решения pre 'GroupLayout', но посмотрите на это в первую очередь. –

ответ

3

Вы можете использовать вашу идею FlowLayout и до сих пор делают этикетки/TextFields модельный ряд. Добавьте стойку к каждой панели «ключ/значение», размер которой составляет самую длинную метку, чтобы привести текстовое поле вправо на ту же сумму на каждой панели. Что-то вроде:

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 Не большой поклонник Миг. Я знаю, что некоторые гуру здесь клянутся, поэтому я уверен, что это имеет свои достоинства. Обычно, если я использую код GBL, я использую некоторые вспомогательные классы, которые я написал, чтобы устранить большую часть кода GBL, который вы видите здесь. – splungebob

Смежные вопросы