有人可以向我解释,为什么每次我使用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);
}
}
答案 0 :(得分:7)
从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);
}
} );
}
}
答案 1 :(得分:1)
使用: JTextField tf = new JTextField(25);
而不是: JTextField tf = new JTextField(); tf.setSize(base.getWidth(),25);
答案 2 :(得分:1)
使用LayoutManagers时,请勿尝试手动设置大小和位置。您与LayoutManager的功能相冲突。布局管理器根据约束和首选/最小/最大尺寸确定组件的大小和位置。大多数Swing组件会自动处理,因此您通常不应强制使用其首选大小。
对于您的JTextField,由于它不包含任何文本,因此其首选大小几乎为零。使用setColumns表示preferredSize或调用setPreferredSize
答案 3 :(得分: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在下一行。