2017-07-04 32 views
0

發生了一些奇怪的事情。我有一個文本區域和一個按鈕。當我在該區域輸入文字時,按鈕開始移動!請參閱附件代碼。我嘗試添加更多層面板並設置組件對齊,但仍然發生。java - JTextArea動態擴展(不受歡迎)

class MyFrame extends JFrame { 
... 
public MyFrame() { 
    super("example"); 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    add(panel); 

    JTextArea _textArea = new JTextArea(); 
    _textArea.setSize(800, 600); 
    panel.add(_textArea); 

    JButton btn = new JButton("Send"); 
    panel.add(btn); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(1000, 800); 
    setVisible(true); 
    } 
} 

什麼是神祕的一切?一個組件如何影響另一個組件?

回答

1

BoxLayoutBorderLayout複雜得多,這正是您所需要的。 BorderLayout使用一般說明,如NORTH,EAST,SOUTHWEST,這非常簡單。這裏有簡單的方法來獲得你要找的東西:

class MyFrame extends JFrame { 
    //... 
    public MyFrame() { 
     super("Example"); 
     JTextArea textArea = new JTextArea(); 
     textArea.setSize(800, 600); 
     add(textArea, BorderLayout.CENTER); 

     JButton btn = new JButton("Send"); 
     add(btn, BorderLayout.SOUTH); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(1000, 800); 
     setVisible(true); 
    } 
} 

也短了很多。

+0

這是否使框佈局冗餘? – tamir

+0

@tamir我剛剛編輯我的帖子。請看現在,是的,這就是爲什麼我完全刪除了「BoxLayout」。 – CodingNinja

2

這條線:

_textArea.setSize(800, 600); 

被忽略,因爲組件的父級的佈局管理決定的大小將是什麼。在你的情況下,該LayoutManager是你的BoxLayout。

LayoutManagers確定他們管理的組件的位置和大小。這是他們的工作。他們使用每個組件的最小尺寸,首選尺寸和最大尺寸來決定實際尺寸。如果您想知道確切的算法,請閱讀BoxLayout’s documentation

JTextArea _textArea = new JTextArea(20, 40); 

JTextArea是設計放置在JScrollPane:

一般情況下,通過設置它的行和列設置一個JTextArea的首選尺寸。如果你不把它放在一個JScrollPane,它可能不會像您期望的行動,特別是如果用戶輸入更多的文字而無法放在它:

panel.add(new JScrollPane(_textArea)); 

你或許應該通過JTextArea’s documentation讀更好地理解它。

+0

是否解釋了按鈕上鍵入的效果? – tamir

+0

@tamir是的。 JTextArea的首選大小取決於其中的文本,除非您設置了行和列。 – VGR