有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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组件——请不要使用第三方库

谢谢大家!


共 (4) 个答案

  1. # 1 楼答案

    使用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);
    

    这将在调整帧大小时动态更改textfield的大小

  2. # 2 楼答案

    这是一个由两部分组成的问题:

    a)所有xxSize(xx=min/max/pref)对于布局经理来说都只是提示。每个LayoutManager都有自己的行为,如果/如何/当它尊重这些提示,如果/如何/当它违反一个或多个规则,如果总空间大于或小于容器中所有组件的pref之和。别无选择,只能知道哪个做什么(文档是……嗯……次优的)

    b)如果空间允许,JTextField允许其高度无限增长,这有点疯狂。这意味着即使是尊重max的布局经理(比如f.i.BoxLayout)也没有机会这么做,max是整数。最大值(或Short.MAX?忘记)。要使其正常工作,请对maxSize进行子类化并重写,以返回pref height:

    @Override
    Dimension getMaximumSize() {
       Dimension max = super.getMaximumSize();
       max.height = getPreferredSize().height; 
       return max;
    }
    
  3. # 3 楼答案

    我建议你使用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);
    
                }
            });
        }
    }
    
  4. # 4 楼答案

    你应该能够使用水平的盒子布局

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

    不应猜测文本字段的高度

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

    我知道你说过你不想使用第三方库,但作为补充说明,你可能想看看Text Field Prompt。它允许您显示一条消息,当您开始在文本字段中键入时,该消息将消失