【问题标题】:JTextField displayed as slit when using FlowLayout...please explain使用 FlowLayout 时 JTextField 显示为狭缝...请解释
【发布时间】:2012-05-11 10:25:43
【问题描述】:

谁能给我解释一下,为什么我每次都使用 FlowLayout 布局管理器 我的文本字段显示为狭缝。

这个问题我已经有一段时间了,但我似乎无法弄清楚 找出为什么会出错。

我觉得这是一件简单的事情,我一次又一次地忽略了,所以如果 请有人向我解释这种现象,我将永远感激不尽。

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Console
{   
    public Console()
    {
        makeConsole();
    }

    private void makeConsole()
    {
        JFrame console = new JFrame("ArchiveConsole");
        Container base  = console.getContentPane();
        base.setSize(400, 250);
        console.setSize(base.getSize());
        base.setLayout(new FlowLayout(FlowLayout.CENTER, 5,5));

        JTextField tf = new JTextField();
        tf.setSize(base.getWidth(), 25);
        base.add(tf);

        console.setVisible(true);
    }
}

【问题讨论】:

    标签: java swing jtextfield flowlayout


    【解决方案1】:

    来自 Swing 布局管理器教程

    FlowLayout 类将组件排成一行,并按其首选大小调整大小。如果容器中的水平空间太小,无法将所有组件放在一行中,则 FlowLayout 类使用多行。如果容器比一行组件所需的宽,则默认情况下,该行在容器内水平居中

    因此您需要调整文本字段的首选大小,最好使用setColumns 方法。

    请注意,如果您希望文本字段跨越整个宽度,则可能需要使用其他布局,然后 FlowLayout 出于上述原因

    例如,下面的代码给出了一个漂亮的JTextField,但我已经硬编码了列数

    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import java.awt.Container;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    
    public class TextFieldWithFlowLayout {
      public static void main( String[] args ) {
        EventQueue.invokeLater( new Runnable() {
          @Override
          public void run() {
            JFrame console = new JFrame("ArchiveConsole");
            Container base  = console.getContentPane();
            base.setLayout(new FlowLayout( FlowLayout.CENTER, 5,5));
    
            JTextField tf = new JTextField();
            tf.setColumns( 20 );
            base.add(tf);
            console.pack();
            console.setVisible(true);
          }
        } );
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用: JTextField tf = new JTextField(25);

      而不是: JTextField tf = new JTextField(); tf.setSize(base.getWidth(), 25);

      【讨论】:

        【解决方案3】:

        当您使用 LayoutManagers 时,不要尝试手动设置大小和位置。您与 LayoutManager 的作用相冲突。 Layoutmanagers 根据约束和首选/最小/最大尺寸大小和位置组件。大多数 Swing 组件会自动处理该问题,因此您通常不应强制使用它们的首选大小。

        对于您的 JTextField,由于它不包含任何文本,因此它的首选大小几乎为零。使用setColumns 表示preferredSize 或调用setPreferredSize

        【讨论】:

        • 感谢指点,我解决了问题,离真正理解布局管理器更近了。
        【解决方案4】:

        谢谢!

        在JTextField函数中使用的参数很重要!

        JPanel panel_buttons = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel_buttons.add(...);
        ...
        panel_buttons.add(...);
        JTextField txt_search = new JTextField(20);
        panel_buttons.add(txt_search);
        

        如果将 20 更改为 30 或更大,可能是你找不到它。可能是 txt_search 在下一行。

        【讨论】:

          猜你喜欢
          • 2011-05-30
          • 1970-01-01
          • 2020-05-10
          • 2012-01-19
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多