创建动态调整其宽度的文本字段

时间:2011-04-05 16:42:33

标签: java swing jtextfield

我正在制作基本上包含搜索字段和一些按钮的工具栏。当父容器变宽时,我希望搜索字段的大小(仅宽度)增大,就像用户调整分割窗格一样。目前,文本字段和按钮将保持相同的大小,并且随着容器的加宽,在任一侧添加空白。我可以通过在容器中使用BorderLayout并将按钮放在LINE_END上并将文本字段放在CENTER中来实现这种增长效果。我遇到的问题是文本字段现在变得比标准文本字段高,看起来很难看。这种行为很有意义,因为BorderLayout管理器会将所有额外空间(包括垂直和水平空间)提供给CENTER文本字段。我试图通过在文本字段上放置最大尺寸来限制此垂直增长,但BorderLayout将不会遵守它。

这就是我所拥有的:

final JTextField searchField = new JTextField("Enter your search terms");
searchField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 25));
final JPanel controls = new JPanel(new BorderLayout());
controls.add(searchField, BorderLayout.CENTER);
controls.add(new JPanel(){{
    add(new JButton("Search")); add(new JButton("I'm Feeling Lucky"));
}}, BorderLayout.LINE_END);

看起来这种行为是一种常见的行为,应该很容易实现,但在查看了所有Oracle / Sun教程和Google搜索结果后,我没有运气。

有人对此有任何解决方案吗?我需要坚持使用标准的Java Swing组件 - 请不要使用第三方库。

谢谢!

4 个答案:

答案 0 :(得分:2)

我建议你使用GridBagLayout,它很复杂,但它是最强大的布局..当你学习它时,你就不会有任何布局问题。

以下是对此问题使用gridbaglayout的示例...

import java.awt.BorderLayout;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class GridBagLayoutExample extends JFrame {

    GridBagLayoutExample() {
        initUI();
    }


    private void initUI() {
        final JTextField searchField = new JTextField("Enter your search terms"); 
        final JPanel controls = new JPanel(new GridBagLayout()); 
        GridBagConstraints c = new GridBagConstraints();
        c.weightx=1.0;
        c.fill=GridBagConstraints.HORIZONTAL;
        controls.add(searchField,c); 
        controls.add(new JPanel(){
            {     
            add(new JButton("Search")); add(new JButton("I'm Feeling Lucky")); }}); 
        setLayout(new BorderLayout());
        add(controls, BorderLayout.NORTH);
        pack();
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GridBagLayoutExample().setVisible(true);

            }
        });
    }
}

答案 1 :(得分:1)

这是一个两部分问题:

a)所有xxSize(xx = min / max / pref)仅仅是提示到LayoutManager。每个LayoutManager都有自己的行为,如果/如何/何时它会尊重这些提示,如果整体空间大于或小于容纳容器中所有组件的pref之和,则它是否/如何/何时违反一个或多个。没办法,但要了解哪些做了什么(文档是......呃...次优)

b)如果空间允许,JTextField允许其高度无限增长有点疯狂。暗示即使是尊重max的LayoutManagers(如f.i.BoxLayout)也没有机会这样做,max是Integer.MAX_VALUE(或Short.MAX?忘了)。为了使其行为,子类化并覆盖maxSize以返回pref height:

@Override
Dimension getMaximumSize() {
   Dimension max = super.getMaximumSize();
   max.height = getPreferredSize().height; 
   return max;
}

答案 2 :(得分:0)

您应该可以使用水平BoxLayout。

searchField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 25)); 

您不应该猜测文本字段的高度。

Dimension d = searchField.getPreferredSize();
d.width = Integer.MAX_VALUE;
searchField.setMaximumSize(d);

我知道您说您不想使用第三方库,但作为旁注,您可能需要查看Text Field Prompt。它允许您显示在开始在文本字段中键入时将消失的消息。

答案 3 :(得分:0)

使用BoxLayout

JTextField search_field = new JTextField("Enter search term");
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(search_field);

这将在调整框架大小时动态更改文本字段的大小。