java创建动态调整宽度的文本字段
我制作的基本上是一个包含搜索字段和一些按钮的工具栏。我希望当父容器变宽时,搜索字段的大小(只是宽度)会增加,就像用户调整拆分窗格时一样。当前,文本字段和按钮的大小将保持不变,并且随着容器的加宽,在两侧添加空白。我可以通过在容器中使用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搜索结果后,我没有运气
有人能解决这个问题吗?我需要坚持使用标准的JavaSwing组件——请不要使用第三方库
谢谢大家!
# 1 楼答案
使用BoxLayout
这将在调整帧大小时动态更改textfield的大小
# 2 楼答案
这是一个由两部分组成的问题:
a)所有xxSize(xx=min/max/pref)对于布局经理来说都只是提示。每个LayoutManager都有自己的行为,如果/如何/当它尊重这些提示,如果/如何/当它违反一个或多个规则,如果总空间大于或小于容器中所有组件的pref之和。别无选择,只能知道哪个做什么(文档是……嗯……次优的)
b)如果空间允许,JTextField允许其高度无限增长,这有点疯狂。这意味着即使是尊重max的布局经理(比如f.i.BoxLayout)也没有机会这么做,max是整数。最大值(或Short.MAX?忘记)。要使其正常工作,请对maxSize进行子类化并重写,以返回pref height:
# 3 楼答案
我建议你使用GridBagLayout,它很复杂,但却是最强大的布局。。当你学会了它,你就不会有任何布局问题
下面是gridbaglayout在这个问题上的示例用法
# 4 楼答案
你应该能够使用水平的盒子布局
不应猜测文本字段的高度
我知道你说过你不想使用第三方库,但作为补充说明,你可能想看看Text Field Prompt。它允许您显示一条消息,当您开始在文本字段中键入时,该消息将消失