2013-11-27 8 views
1

Я работаю над макетом для простого экрана входа. Я использую GridLayout для того, чтобы манипулировать элементы, но наткнулся на вопрос, она занимает всю ширину кадра, как это:Как исправить JPanel с сеткой, которая занимает полную ширину рамки?

enter image description here

Где, как я хочу быть с фиксированным положением и шириной, высотой и быть вертикально, горизонтально центрироваться внутри рамки, но не занимать его в полном размере. Возможно, метки для имени пользователя и пароля занимают меньше места, поэтому текстовые поля на самом деле ближе к ним. Я попытался установить основной размер моей панели, например .setMaximumSize(Dimension (200, 150));

Но это не работает.

 //Create the frame. 
     JFrame frame = new JFrame("Online Shop"); 
     JPanel mainPanel = new JPanel(); 
     JPanel usernamePanel = new JPanel(); 
     JPanel passwordPanel = new JPanel(); 
     JPanel buttonPanel = new JPanel(); 

     JButton loginButton = new JButton("Login"); 
     loginButton.setMaximumSize(new Dimension(100, 50)); 
     JTextField username = new JTextField(); 
     JLabel usernameLabel = new JLabel("Username"); 
     JPasswordField password = new JPasswordField(); 
     JLabel passwordLabel = new JLabel("Password"); 

     //Panel 
     frame.setContentPane(mainPanel); 

     usernamePanel.setLayout(new GridLayout(1,2)); 
     usernamePanel.add(usernameLabel); 
     usernamePanel.add(username); 

     passwordPanel.setLayout(new GridLayout(1,2)); 
     passwordPanel.add(passwordLabel); 
     passwordPanel.add(password); 

     mainPanel.setLayout(new GridLayout(3, 1)); 
     mainPanel.add(usernamePanel); 
     mainPanel.add(passwordPanel); 
     mainPanel.add(loginButton); 

     //Event Listeners 
     frame.addWindowListener(new MyWindowListener()); 
     loginButton.addActionListener(new MyActionListener()); 

     //Sizes, Positioning 
     frame.setSize(720, 480); 
     frame.setLocationRelativeTo(null); 

     //Show Frame 
     frame.setVisible(true); 
+0

Обратите внимание, что экран входа в систему, используя только 'GridLayout' будет * всегда * выглядеть как мусор. Обычно я использовал сложный макет или «GroupLayout» для таких вещей. Также согласитесь с обоими camickr & trashgod, что явно задание размеров - очень плохая идея. См. [Я должен избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

ответ

4
frame.setSize(720, 480); 

Не используйте метод SetSize().

Вместо этого используйте:

frame.pack(); 

использовать также:

JTextField username = new JTextField(10); 

Чтобы дать текст поля предпочтительное количество символов.

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

Если вы хотите немного дополнительного пространства между компонентами и рамой, то вы можете сделать:

mainPanel.setBorder(new EmptyBorder(20, 20, 20, 20)); 
+0

Использование пакета в порядке, однако If Я расширяю его, он все еще поддерживает это «растягивающее» поведение, кроме того, мне нужно иметь возможность манипулировать размерами панелей, а также определенным начальным размером кадра. есть ли способ манипулировать размерами панелей – Ilja

+0

Это экран входа в систему. У пользователя нет необходимости изменять размер диалогового окна. Используйте метод setResizable (false). Однако один из способов обойти это - создать панель добавления под названием «contentPane». Добавить contentPane в фрейм. Затем добавьте mainPanel в contentPane. По умолчанию панели используют FlowLayout, и предпочтительный размер добавленных к нему компонентов будет сохранен. «Кроме того, мне нужно иметь возможность манипулировать размерами панелей» - это редко бывает хорошим требованием. Опять же, Swing лучше знает, какой предпочтительный размер компонентов должен быть основан на шрифте и так далее. – camickr

+0

@camickr правильный; кроме того, убедитесь, что вы избегаете этого [ловушка] (http://stackoverflow.com/a/12532237/230513). – trashgod

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