[英]Positioning of components (how to place a few buttons center screen same size)
可靠,推薦的方式將組件准確地放置在JFrame上所需的位置?
就我而言,我有一個簡單的Jframe充當菜單。 框架由頂部的標簽和中間的三個按鈕組成。 使用免費設計,這三個按鈕似乎漂浮在框架上,當我運行該項目時,它們移到了難看的位置。 僅將3個按鈕拖動到最大長度(到框架的每一側)時,它們的行為才是“鎖定到位”。 這非常丑陋。我希望將3個按鈕集中在框架中間。
我正在使用Netbeans。 自由設計是我一直在使用的,但是只有在有很多組件時它們才是好選擇,這樣它們可以“捕捉”到彼此的位置。 使用其他集合布局管理器已成功進行。 有經驗的人將如何處理這樣的問題?
我對全面學習感興趣。 如果這個問題是業余的,那么至少有人可以推薦一本教科書或其他GUI學習資源嗎? (我已經看過兩次“使用Java首先實現對象”,它們那里只有關於GUI構建的非常基本的說明)。
感謝您的指示。
事情很簡單,但是,當然,您應該自己進行一些搜索。
順便說一句,您在管理按鈕的布局和大小方面存在問題。
忘了使用任何布局創建器,因為它們會生成混亂的代碼,並且不了解實際情況是不好的。
通常,對於初學者,我會談論一種特定的布局,即BoxLayout [編輯:當然,有許多更簡單的方法可以達到目標,這個答案具有教學目的,並且希望足夠大以供理解,而不僅僅是成為“在這里,執行此復制粘貼操作]
首先,我們需要了解Box布局的工作方式。 它有兩種AXIS(即添加組件的位置的方式),從上到下(PAGE_AXIS)和從左到右(LINE_AXIS)。 使用這兩個軸並嵌套各種布局,您可以隨心所欲。
首先要知道的是如何嵌套更多的布局。
為了嵌套布局,我們將使用JPanel,每一個都有不同的軸,將一個軸放置在另一個軸內。
開始分析您的情況。 您在面板中央的三個按鈕上有一個標簽。 我們可以從內部面板開始,其中一個是“組件”;另一個是“內部”。 我們需要一個PAGE_AXIS(從頂部到botton),其中包括:
// +---------------------+
// | white space |
// | |
// + - - - - - - - - - - +
// |JLABEL JLABEL JLABEL|
// + - - - - - - - - - - +
// | white space |
// |_____________________|
// | button |
// |---------------------|
// |_____________________|
// | button |
// |---------------------|
// |_____________________|
// | button |
// |---------------------|
// | white space |
// +---------------------+
如您所見,面板適合於匹配組件的寬度,其竅門是BoxLayout傾向於為組件提供最大尺寸。 在這種情況下,沒有邊距,因此我們需要一個帶有LINE_AXIS的外部不同JPanel,以便放置左右邊距,結果將是:
// +---+---------------------+---+
// | | white space | |
// | | | |
// | + - - - - - - - - - - + |
// | W |JLABEL JLABEL JLABEL| W |
// | H + - - - - - - - - - - + H |
// | I | white space | I |
// | T _____________________ T |
// | E | button | E |
// | --------------------- |
// | S _____________________ S |
// | P | button | P |
// | A --------------------- A |
// | C _____________________ C |
// | E | button | E |
// | --------------------- |
// | | white space | |
// +-----------------------------+
因此,我們需要知道的第一件事就是為每個面板設置布局。
// Initializing
JPanel outside = new JPanel();
JPanel inside = new JPanel();
// setting a layout with horizontal alignment
outside.setLayout(new BoxLayout(outside, BoxLayout.LINE_AXIS));
// setting a layout with vertical alignment
inside.setLayout(new BoxLayout(inside, BoxLayout.PAGE_AXIS));
完成后,我們必須填充面板。 從外面開始。 局外人需要(看我的圖像)首先是一個水平空間,然后是內部面板,然后是另一個水平空間。 我繼續添加它們。
// create an horizontal space of 20px
outside.add(Box.createHorizontalStrut(20));
outside.add(inside);
outside.add(Box.createHorizontalStrut(20));
現在我們移到內部,我們需要一個較大的白色空間,一個標簽,另一個白色,一個按鈕,一個小的白色,該按鈕,一個小的白色,第三個按鈕和一個大的白色。 我繼續用這個填充內部面板。
// create a vertical space of 20px
inside.add(Box.createVerticalStrut(20));
JLabel title = new JLabel("THE TITLE");
inside.add(title);
inside.add(Box.createVerticalStrut(20);
JButton btt1 = new JButton("BUTTON ONE");
// create a new dimension object
Dimension d = new Dimension(200,40);
// set the four kind of size, the button CANNOT be different than the dimension I choose
btt1.setSize(d);
btt1.setMinimumSize(d);
btt1.setMaximumSize(d);
btt1.setPreferredSize(d);
JButton btt2 = new JButton("BUTTON TWO");
btt2.setSize(d);
btt2.setMinimumSize(d);
btt2.setMaximumSize(d);
btt2.setPreferredSize(d);
JButton btt3 = new JButton("BUTTON THREE");
btt3.setSize(d);
btt3.setMinimumSize(d);
btt3.setMaximumSize(d);
btt3.setPreferredSize(d);
// Now that the button are ready we put them in the panel.
inside.add(btt1);
inside.add(Box.createVerticalStrut(5));
inside.add(btt2);
inside.add(box.createVerticalStrut(5));
inside.add(btt3);
// Last white space, the bottom margin:
inside.add(Box.createVerticalStrut(20));
現在,我的結構已經完美設置。 只需使其可見即可。 當然,您需要將其放在JFrame或JDialog中,當然,第一個面板可以是JFrame或JDialog,因為可以為任何組件設置BoxLayout。
希望通過本基礎教程,您可以了解這種結構編程的基礎。 但是您將需要閱讀以下內容,以使事情變得更加復雜: http : //docs.oracle.com/javase/tutorial/uiswing/layout/index.html http://docs.oracle.com/javase /tutorial/uiswing/layout/box.html
祝你今天愉快。
布局功能強大而且省時。。。來自其他語言,例如Delphi和VB,我可以告訴你Swing的最佳功能之一就是布局管理器。
public class TestLayout06 {
public static void main(String[] args) {
new TestLayout06();
}
public TestLayout06() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new MenuPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected class MenuPanel extends JPanel {
public MenuPanel() {
JLabel label = new JLabel("Menu");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(label, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridy++;
add(new JButton("Option 1"), gbc);
gbc.gridy++;
add(new JButton("Option 2"), gbc);
gbc.gridy++;
add(new JButton("Option 3"), gbc);
}
}
}
看一眼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.