2016-04-15 119 views
0

這可能是在這裏回答的,但是我的搜索引出了一個空白,也許我正在尋找錯誤的東西。如何停止伸展JTextArea和JTextField?

如何阻止JTextAreaJTextField拉伸?擺動是否提供了某種我可以添加的面板墊片,在任何其他元素之前都會拉伸?

我有一個JPanel它填充一個設置大小的JFrame。它使用BoxLayout設置爲PAGE_AXIS。如果我添加大小爲3,100的JTextArea,它將忽略這些行/列的大小並填充所有可用空間。

同樣,我有一個JPanelGridLayout。如果我添加一個JTextField,而不是按我指定的列大小,它會填充網格中的整個空間。

編輯:下面的圖表顯示了我想要的(在頂部)和我得到的。 enter image description here

+0

請張貼一些代碼片段,以調查該問題。 – Braj

+1

首先查看[放置容器中的組件](http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html),以獲取關於不同佈局管理器的更多詳細信息,類似於'FlowLayout'和'GridBagLayout'可以完成這項工作 – MadProgrammer

+0

以最小尺寸提供ASCII圖形或簡單的*圖形*佈局圖,如果可調整大小,寬度和高度更大。 –

回答

1

直接沒有幾個字從文檔上How to Use GridLayout

甲GridLayout的對象放置在組件單元的網格。每個組件佔用其單元中的所有可用空間,並且每個單元的大小完全相同。如果GridLayoutDemo窗口的大小已調整,則GridLayout對象將更改單元格大小,以便在給容器提供可用空間的情況下單元格儘可能大。

GridLayout不考慮組件的大小。它試圖將組件放入行和列中的可用空間中。


儘量避免顯式設置大小。有一個關於Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?的非常好的帖子,可以幫助你更好地設計它。


有很多佈局經理可以根據您的要求進行調整。請看看How to Use Various Layout Managers


可以使用GridBagLayout而不是GridLayout到部件的行和列,就像表的佈局,讓你在網格寬度,高度,保證金,填充柱,行更多的控制權劃分等

+0

感謝那些有用的鏈接。我想指定大小的原因是因爲我有輸入約束(即我想在該JTextView中最多有8個字符,這就是爲什麼我將它創建爲「新JTextView(8)」)在我使用的其他UI庫(Android/Qt)中,您可以添加間隔符或空面板,並設置這些組件的「拉伸因子」,使其不是(在這種情況下)伸展以填充可用空間的TextView/Area。 – Lieuwe

0

在我的代碼我只設置

JTextField data = new JTextField(); 
data.setColumns(30); 
+0

*「我只是設置列數」*這個問題已經提到了在文本區域和字段中這樣做的問題。這裏的問題是**佈局**正在拉伸組件以適應可用空間。 –

+0

我也設置了MaxSize –

0

列的你不能這樣做嚴重的佈局枝條GridLayoutBoxLayout數量。忘記 關於他們。

第一個問題是:你確定你不想讓JTextAreaJTextField增長? UI中的一個標準是這些組件正在增長和縮小;第一個在兩個方向,第二個在水平方向。

無論如何,我發佈解決方案GroupLayoutMigLayout,這是我強烈建議的經理 。

一個)GroupLayout

每個組件有三種尺寸:最小,優選的,並且最大。這些 設置爲每個組件的一些合理的默認設置。這就是爲什麼趨向於水平增長的原因;其最大值被設置爲一個非常大的數字 。

package com.zetcode; 

import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class GroupLayoutStretchingEx extends JFrame { 

    public GroupLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("Stretching"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl); 

     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING) 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createSequentialGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, 
         GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
       .addGroup(gl.createParallelGroup() 
         .addComponent(arg[1]) 
         .addComponent(arg[2], GroupLayout.DEFAULT_SIZE, 
           GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) 
     ); 

     pack(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      GroupLayoutStretchingEx ex = new GroupLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

GroupLayout,你需要在addComponent()方法的最大 元件尺寸設定正確的值。

JTextArea area = new JTextArea(12, 20); 

通過設置行數和列數爲JTextArea,我們 設置此組件的大小參訪。佈局管理器在其計算中稍後使用該值 。

b)中MigLayout

MigLayout,我們控制與各種 約束部件的resizement,如fillgrow,或push。通過不使用它們, 組件不會增長。

package com.zetcode; 

import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 

public class MigLayoutStretchingEx extends JFrame { 

    public MigLayoutStretchingEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JTextArea area = new JTextArea(12, 20); 
     area.setBorder(BorderFactory.createEtchedBorder()); 
     JLabel input = new JLabel("Input"); 
     JTextField textField = new JTextField(15); 

     createLayout(area, input, textField); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     setLayout(new MigLayout()); 

     add(arg[0], "wrap"); 
     add(arg[1], "split 2"); 
     add(arg[2], "growx"); 
     pack(); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutStretchingEx ex = new MigLayoutStretchingEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

這裏是截圖:

Screenshot from the MigLayout example

相關問題