添加到BorderLayout的JTextArea不可见

时间:2016-11-02 12:19:09

标签: 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.EAST);

上面的代码如下:

enter image description here

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

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

上面的代码如下:

enter image description here

有人可以帮忙吗?感谢。

4 个答案:

答案 0 :(得分:1)

您的JTextArea没有初始尺寸,因此不可见。我假设你想要一个固定的宽度和一个可变的高度,所以我认为这就是你想要的

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

答案 1 :(得分:0)

你试过

吗?
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

答案 2 :(得分:0)

您需要将组件设置到滚动窗格中。 例如,如果您需要滚动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);

答案 3 :(得分:0)

确保JTextArea有要显示的消息。使用Swing类时,需要考虑3种不同的大小:最小尺寸,最大尺寸和首选尺寸。布局将使用这些尺寸来显示组件。在BorderLayout的情况下,这应该在SOUTH,NORTH,WEST和EAST组件上调用getMinimumSize(),在CENTER组件上调用getPreferredSize()。 JTextArea的最小大小是拟合文本所需的大小,因此没有文本集的JTextArea将返回一个新的Dimension(0,0)。

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

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