Java 添加到BorderLayout的JTextArea不可见

Java 添加到BorderLayout的JTextArea不可见,java,swing,border-layout,Java,Swing,Border Layout,我有四个组件,我想将它们添加到设置了BorderLayout的框架中。MenuBar向北,JScrollPane向中央,JTextField向南,JTextArea向东。问题是最后一个组件不可见 setLayout(new BorderLayout()); add(menu, BorderLayout.NORTH); add(scrollChatPane, BorderLayout.CENTER); add(myMessage, BorderLayout.SOUTH); add(users,

我有四个组件,我想将它们添加到设置了BorderLayout的框架中。MenuBar向北,JScrollPane向中央,JTextField向南,JTextArea向东。问题是最后一个组件不可见

setLayout(new BorderLayout());

add(menu, BorderLayout.NORTH);
add(scrollChatPane, BorderLayout.CENTER);
add(myMessage, BorderLayout.SOUTH);
add(users, BorderLayout.EAST);
上述代码的工作原理如下:

但当我用简单的按钮替换我的组件时,一切正常:

setLayout(new BorderLayout());

add(new Button("North"), BorderLayout.NORTH);
add(new Button("Center"), BorderLayout.CENTER);
add(new Button("South"), BorderLayout.SOUTH);
add(new Button("West"), BorderLayout.WEST);
add(new Button("East"), BorderLayout.EAST);
上述代码的工作原理如下:

有人能帮忙吗?谢谢。

你试过了吗

frame.getContentPane().add(menu, BorderLayout.NORTH);
frame.getContentPane().add(scrollChatPane, BorderLayout.CENTER);
frame.getContentPane().add(myMessage, BorderLayout.SOUTH);
frame.getContentPane().add(users, BorderLayout.EAST);

如果直接使用JFrame的内容窗格,则不需要setLayout。您的
JTextArea
没有初始大小,因此不可见。我假设你想要一个固定的宽度和一个可变的高度,所以我想这就是你想要的

JTextArea users = new JTextArea();
users.setPreferredSize(new Dimension(100, users.getHeight()));
add(users, BorderLayout.EAST);

您需要在滚动窗格中设置组件。 例如,如果需要滚动
myMessage

scrollChatPane.setViewportView(myMessage);
setLayout(new BorderLayout());

add(menu, BorderLayout.NORTH);
add(scrollChatPane, BorderLayout.CENTER);
add(users, BorderLayout.EAST); // probably add(new JScrollPane(users), BorderLayout.EAST);

确保JTextArea有要显示的消息。在使用Swing类时,需要考虑3种不同的尺寸:最小尺寸、最大尺寸和首选尺寸。布局将利用这些尺寸来显示组件。在BorderLayout的情况下,应该对南、北、西和东组件调用getMinimumSize(),对中心组件调用getPreferredSize()。JTextArea的最小大小是适合文本所需的大小,因此没有文本集的JTextArea将返回一个新维度(0,0)

PS:运行时对Swing组件的更改应该通过SwingUtilities在Swing线程上完成。因此,如果在运行时为JTextArea定义文本,则需要执行以下操作

Runnable something = new Runnable(() -> {
    component.revalidate();
    component.repaint();
};
SwingUtilities.invokeLater(something);

它起作用了。我尝试了同样的方法,但是使用了setMinimumSize()却忘记检查setPreferredSize()。你知道为什么第一种方法不起作用吗?不完全知道。AFAIK
setMinimumSize()
setMaximumSize()
在调整帧大小时缩放组件时提供限制
setPreferredSize()
定义初始缩放。但并不总是确定何时使用哪个。他不必设置大小,只需调用
jFrame.pack()
@saclryrbarlonium No即可。如果
JTextArea
没有初始内容,它就没有初始大小。另外,
pack()
调用将给出零宽度大小。@ArcticLord-pack()使用首选大小。这是全自动的。尝试在不定义大小的情况下创建GUI。一些简单的边界布局。最后使用它。