2017-01-19 18 views
1

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

Для справки, здесь находится SSCCE с кнопкой OK, которая выравнивается влево, когда мы явно устанавливаем горизонтальное выравнивание по центру.

import javax.swing.*; 
import java.awt.*; 

public class E { 

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JPanel notificationView = new JPanel(); 
    notificationView.setPreferredSize(new Dimension(300, 145)); 
    notificationView.setLayout(new GridBagLayout()); 
    JPanel content = new JPanel(); 
    content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 

    JLabel notificationText = new JLabel("Here is some text to display to the user and below this is an ok button."); 
    content.add(notificationText); 
    JButton buttonOkNotification = new JButton("OK"); 
    //buttonOkNotification.setHorizontalAlignment(JLabel.CENTER); // does not do anything 
    //buttonOkNotification.setAlignmentX(Component.CENTER_ALIGNMENT); // does not do anything 
    content.add(buttonOkNotification); 

    notificationView.add(content); 
    frame.add(notificationView); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 
} 
+0

Те составные свойства не имеют значения для разметки, они используются только намекнуть компонент, как использовать его площадь. Они могут быть использованы, например, контролируйте выравнивание текста в JTextField. Они не изменяют способ компоновки компонента в контейнере. Для менеджеров макета см. Https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html – Durandal

+2

1) * «Для справки, вот SSCCE ..» * Нет, это фрагмент кода, который несовместим. Пожалуйста, внимательно прочитайте ** документы на [MCVE] и [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) См. [Я должен избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) 3) Предоставить искусство ASCII или простой чертеж * предполагаемого * макета GUI при минимальном размере и возможность изменения размера, с большей шириной и высотой. 4) Обратите внимание, что вызовы, вызываемые на кнопке, должны выровнять ** содержимое кнопки **, а не сама кнопка. –

+0

1) Я не включил объявление класса, чтобы сохранить его минимальным, но теперь я его отредактировал. 2) Я не использую ни один из методов, на которые ссылается ваша ссылка.3) Хорошо, я сделаю отдельный вопрос о том, как добиться определенного взгляда на мой конкретный встроенный графический интерфейс. 4) Это фактически отвечает на общий вопрос, который я разместил здесь, спасибо. –

ответ

3
JButton buttonOkNotification = new JButton("OK"); 
//buttonOkNotification.setHorizontalAlignment(JLabel.CENTER); // does not do anything 
//buttonOkNotification.setAlignmentX(Component.CENTER_ALIGNMENT); // does not do anything 

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

  • Чтобы растянуть компонент в горизонтальном направлении, но не по вертикали, добавить его к PAGE_START или PAGE_END ,
  • Чтобы растянуть компонент вертикально, но не горизонтально, добавьте его в LINE_START или LINE_END.
  • Чтобы растянуть компонент как по вертикали & горизонтально, добавьте его в CENTER.

Контрастность с FlowLayout. Макет потока не растягивает компоненты вертикально или горизонтально, вместо этого всегда сохраняя их по своему предпочтительному размеру.


Для выравнивания кнопки компонента в пределах панели, необходимо использовать ограничения для компоновки. Это может быть сделано на строительство, например .:

new FlowLayout(FlowLayout.RIGHT); // aligns all child components to the right hand side 

Но чаще делается при добавлении компонента к контейнеру. НАПРИМЕР. при добавлении компонента к GridBagLayout, это может выглядеть следующим образом:

gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
panel.add(new JLabel("North West"), gridBagConstraints);