5

有人可以向我解释一下,为什么每次我使用 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);
    }
}
4

4 回答 4

10

来自 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);
      }
    } );
  }
}
于 2012-05-11T10:36:39.887 回答
1

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

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

于 2012-05-11T10:36:49.607 回答
1

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

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

于 2012-05-11T10:38:26.457 回答
0

谢谢!

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 在下一行。

于 2016-12-23T02:52:14.930 回答