java - 我应该使用什么布局管理器
问题描述
我正在用 java 聊天,需要在 JPanel 中显示旧消息。我需要一个图像和正在发送/接收的消息来显示,每个都在自己的行上。我目前拥有的代码:
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel container = new JPanel();
container.setPreferredSize(new Dimension(300, 400));
// Printing five messages
for (int i = 0; i < 5; i++) {
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(300, 40));
p.setBorder(BorderFactory.createLineBorder(Color.BLACK));
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
JLabel img = new JLabel("Image : ");
JLabel txt = new JLabel("This is some text");
p.add(img);
p.add(txt);
img.setAlignmentX(Component.LEFT_ALIGNMENT);
txt.setAlignmentX(Component.LEFT_ALIGNMENT);
container.add(p);
}
f.add(container);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
现在我正在指定每条消息的宽度和高度,这不是很好,因为它应该自动调整大小以适应其内容。我觉得应该有一个很好的布局管理器,但我是新手,所以我不知道该使用哪一个,因此感谢您的帮助。
解决方案
它应该自动调整大小以适应其内容。
让文本换行是这里的主要问题。
一种方法可能是:
- 使用垂直框 - 它允许每个组件具有不同的高度
- 将文本包装在 HTML 中 - 它将允许文本换行
就像是:
import java.awt.*;
import javax.swing.*;
public class Chat extends JPanel
{
private Box messageBox = Box.createVerticalBox();
public Chat()
{
setLayout( new BorderLayout() );
add(messageBox, BorderLayout.PAGE_START);
addMessage("Short message");
addMessage("A longer message that should wrap as reqired onto another line. This should happen dynamically");
}
public void addMessage(String text)
{
JPanel messagePanel = new JPanel( new BorderLayout() );
JLabel label = new JLabel( new ImageIcon("about16.gif") );
messagePanel.add(label, BorderLayout.LINE_START);
JLabel message = new JLabel("<html>" + text + "</html>");
messagePanel.add(message);
messageBox.add(messagePanel);
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("Chat");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Chat());
frame.pack();
frame.setSize(200, 100);
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
推荐阅读
- drupal-8 - Drupal webform 中的字段之一可以是所见即所得的 HTML 字段吗?
- ios - 哪个视频编解码器与 opencv videowriter 一起使用来生成 IOS 或 android 手机可读的视频文件?
- c# - 从文本框到数据网格 WPF C#
- xamarin.forms - 在 Xamarin 表单中检测越狱绕过
- python - ValueError:计算方法分配失败(Python3 odoo)
- javascript - 默认情况下如何在 Material UI 中切换行中的内容?
- windows - Flutter sdk 版本无法识别
- react-native - 出现键盘时输入向上移动
- python - 减少嵌入式 python 库的大小
- javascript - 等待 javascript .find() 结果的最佳实践?