Java 使用FlowLayout时,JTextField显示为狭缝…请解释

Java 使用FlowLayout时,JTextField显示为狭缝…请解释,java,swing,jtextfield,flowlayout,Java,Swing,Jtextfield,Flowlayout,有人能给我解释一下为什么每次我都使用FlowLayout manager吗 我的文本字段显示为狭缝 我在这个问题上碰头已经有一段时间了,我似乎不明白 找出它出错的原因 我觉得这是一件简单的事情,我一次又一次地忽视它,所以如果 请有人给我解释一下这种现象,我将永远感激 import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JTextField; p

有人能给我解释一下为什么每次我都使用FlowLayout manager吗 我的文本字段显示为狭缝

我在这个问题上碰头已经有一段时间了,我似乎不明白 找出它出错的原因

我觉得这是一件简单的事情,我一次又一次地忽视它,所以如果 请有人给我解释一下这种现象,我将永远感激

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);
    }
}

从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);
      }
    } );
  }
}
使用: JTextField=新的JTextField(25)

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

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

至于JTextField,因为它不包含任何文本,所以它的首选大小几乎为零。用于指示首选大小或调用

谢谢

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\u搜索在下一行。

感谢您的指点,我解决了问题,更接近真正理解布局管理器。