2017-01-19 23 views
1

有幾種不同的命令可以在Java Swing中顯式地對齊元素。看來這些命令只能在一些非常特定的約束下工作,並且這些約束在任何地方都沒有記錄。大多數時候,我想要對齊元素,這些命令完全沒有做任何事情。所以我想知道爲什麼這些命令不會做文檔所說的那樣,以及如何在Swing中對齊元素?Java Swing爲什麼有時候只對齊工作?

作爲參考,這裏是一個帶有OK按鈕的SSCCE,當我們明確地將水平對齊設置爲中心時,該按鈕與左邊對齊。

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]和[簡短,獨立,正確的示例](http://www.sscce.org/)上的文檔。 2)請參閱[我是否應避免使用Java Swing中的set(Preferred | Maximum | Minimum)大小方法?](http://stackoverflow.com/q/7229226/418556)(是)3)提供ASCII藝術或以最小尺寸繪製GUI的*預期*佈局的簡單圖形,並且如果可調整大小,則具有更多寬度和高度。 4)請注意,在按鈕上調用的方法是對齊按鈕**的**內容,而不是按鈕本身。 –

+0

1)我沒有包含類聲明以保持最小化,但我現在將其重新編輯回帖。 2)我沒有使用你的鏈接引用的任何方法。3)好的,我將就如何爲特定的intently GUI實現特定的外觀提出一個單獨的問題。 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_STARTPAGE_END
  • 要垂直拉伸組件,但不水平拉伸組件,請將其添加到LINE_STARTLINE_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); 
相關問題