2013-04-15 2 views
0

Я новичок в качелях, и я подозреваю, что проблема связана с BoxLayout. Я пытаюсь сделать ряд текстовых полей и меток один за другим поверх фрейма. Это мой код:Граница границы не занимает все свободное пространство

public static void main(String[] args) { 
    JFrame frame = new JFrame("New Message"); 
    frame.setSize(100, 100); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JTextArea textArea = new JTextArea(); 
    frame.add(textArea, BorderLayout.CENTER); 

    JPanel list = new JPanel(); 
    list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); 
    frame.add(list, BorderLayout.NORTH); 

    String[] labels = {"To: ", "Cc: ", "Bcc: ", "Subject: "}; 
    for (int i = 0; i < labels.length; i++) { 
     JLabel l = new JLabel(labels[i]); 
     JTextField f = new JTextField(); 
     JPanel p = new JPanel(); 
     p.add(l, BorderLayout.WEST); 
     p.add(f, BorderLayout.CENTER); 
     list.add(p); 
    } 

    frame.pack(); 

    frame.setVisible(true); 

} 

Это результат: enter image description here

То, что я хочу, это чтобы, Cc, Bcc и Subject будет весь путь на левой и TextField, чтобы взяться за остальной части пространства.

ответ

3

Мало побочных ноты:

  • Начните свой пользовательский интерфейс от EDT обертывания UI инициализации в SwingUtilities.invokeLater
  • Всегда полезно указать количество столбцов для JTextField, а также строки и столбцы для JTextArea
  • Бесполезно называть setSize(), если вы звоните в pack(). В общем, забудьте об использовании setSize()/setLocation/setBounds() на любом компоненте свинг (оставить все, что LayoutManager-х)

GridBagLayout делает очень хорошую работу здесь. GroupLayout может работать тоже.

Смотрите этот пример:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Mail { 

    protected void initUI() { 
     JFrame frame = new JFrame("New Message"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel list = new JPanel(new GridBagLayout()); 
     frame.add(list, BorderLayout.CENTER); 
     GridBagConstraints labelGBC = new GridBagConstraints(); 
     labelGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look 
     labelGBC.anchor = GridBagConstraints.WEST; // Align left within its cell 
     GridBagConstraints fieldGBC = new GridBagConstraints(); 
     fieldGBC.gridwidth = GridBagConstraints.REMAINDER; // Last element of the row 
     fieldGBC.weightx = 1.0; // Cell takes up all extra horizontal space 
     fieldGBC.fill = GridBagConstraints.HORIZONTAL; // Fill the cell horizontally 
     fieldGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look 
     String[] labels = { "To: ", "Cc: ", "Bcc: ", "Subject: " }; 
     for (int i = 0; i < labels.length; i++) { 
      JLabel l = new JLabel(labels[i]); 
      JTextField f = new JTextField(50); 
      list.add(l, labelGBC); 
      list.add(f, fieldGBC); 
     } 
     GridBagConstraints taGBC = new GridBagConstraints(); 
     taGBC.gridwidth = 2; 
     taGBC.weightx = 1.0; // Cell takes up all extra horizontal space 
     taGBC.weighty = 1.0; // Cell takes up all extra vertical space 
     taGBC.fill = GridBagConstraints.BOTH; // Fill cell in both direction 
     taGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look 
     JTextArea textArea = new JTextArea(10, 80); 
     list.add(new JScrollPane(textArea), taGBC); 

     frame.pack(); 

     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Mail().initUI(); 
      } 
     }); 

    } 
} 

И результат

enter image description here

1

Попробуйте java.awt.FlowLayout, чтобы увидеть один компонент рядом.

+1

'list' &' p' уже 'FlowLayout'. – trashgod

1

Вы можете попробовать установить BorderLayout на каждый JPanel p:

public static void main(String[] args) { 
    JFrame frame = new JFrame("New Message"); 
    frame.setSize(100, 100); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JTextArea textArea = new JTextArea(); 
    frame.add(textArea, BorderLayout.CENTER); 

    JPanel list = new JPanel(); 
    list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); 
    frame.add(list, BorderLayout.NORTH); 

    String[] labels = {"To: ", "Cc: ", "Bcc: ", "Subject: "}; 
    for (int i = 0; i < labels.length; i++) { 
     JLabel l = new JLabel(labels[i]); 
     JTextField f = new JTextField(); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(l, BorderLayout.WEST); 
     p.add(f, BorderLayout.CENTER); 
     list.add(p); 
    } 

    frame.pack(); 

    frame.setVisible(true); 

} 
+0

Не работает, и метки больше не совпадают с текстовыми полями. –

+0

Отредактирован исходный код для выравнивания текстовых полей и меток. – Teetoo

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