如何在JLabel上为聊天窗口进行自动换行

时间:2015-02-13 19:15:54

标签: java swing

我正在尝试制作聊天面板,其中消息文本由JLabel显示,我想在其中进行自动换行,我已插入< html> ...< / html>  在标签和sat preferredSize之后,当我添加许多消息时,滚动不正常,当我向下滚动时,文本后面出现了很多可用空间,如此截图所示

http://s10.postimg.org/5pl2w2tbd/Screenshot_5.png

你能告诉我更好的方法吗?

final class ChatFrame extends JPanel {
        JLabel text;
        JScrollPane scroll = new JScrollPane();
        public ChatFrame(int width,int height) {
            scroll.setPreferredSize(new Dimension(width, height));
            scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            scroll.getViewport().add(this);
            setBorder(new EmptyBorder(5, 5, 5, 5));
            addMessage("<i>Connecting...</i>", false);
        }
        public void addMessage(String message, boolean right) {
            text = new JLabel("<html>"+message+"</html>");
            text.setOpaque(true);
            text.setBackground(Color.lightGray);
            text.setBorder(new EmptyBorder(5, 5, 5, 5));
            add(text);
            JSeparator sep = new JSeparator(JSeparator.HORIZONTAL);
            sep.setMaximumSize(new Dimension(0, 3));
            add(sep);
            revalidate();
        }
        public Component getChatView() {
            return scroll;
        }
    }

2 个答案:

答案 0 :(得分:8)

使用不带边框的不可编辑或禁用的JTextArea。

JTextArea area = new JTextArea();
area.setColumns(50);
area.setWrapStyleWord(true);
area.setEditable(false);
area.setBorder(null);
panel.add(new JScrollPane(area)); // probably without scroll pane if all messages are short

它看起来像一个标签,还有一个额外的好处:用户可以从该区域复制文本。

答案 1 :(得分:2)

您可以使用可以传递给setUI()方法的MultiLineLabelUI类(可用here)中的labelUI:

text = new JLabel(message);
text.setUI(MultiLineLabelUI.labelUI);