我有四个组件,我想将它们添加到具有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);
上面的代码如下:
有人可以帮忙吗?感谢。
答案 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);