2016-04-15 57 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