我正在制作基本上包含搜索字段和一些按钮的工具栏。当父容器变宽时,我希望搜索字段的大小(仅宽度)增大,就像用户调整分割窗格一样。目前,文本字段和按钮将保持相同的大小,并且随着容器的加宽,在任一侧添加空白。我可以通过在容器中使用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组件 - 请不要使用第三方库。
谢谢!
答案 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);
这将在调整框架大小时动态更改文本字段的大小。