添加到 BorderLayout 的 JTextArea 不可见

JTextArea added to BorderLayout is not visible

我有四个组件,我想将它们添加到设置了 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,这应该在 SOUTH、NORTH、WEST 和 EAST 组件上调用 getMinimumSize(),并为 CENTER 组件调用 getPreferredSize()。 JTextArea 的最小大小是适合文本所需的大小,因此没有设置文本的 JTextArea 将 return 一个新的 Dimension(0, 0)。

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

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