簡體   English   中英

組件的位置(如何在相同尺寸的中間屏幕上放置幾個按鈕)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM