0

事实上,我只是开始积极练习挥杆,以便我的理论知识派上用场:) 我已经为聊天 GUI 实现做了很多工作,但最后还是遇到了一些问题。所以我决定从头开始重新设计聊天 GUI,但我需要为它做出正确的组件选择。

首先,我必须说在第一个实现中没有“输入”功能。

我当前的聊天实现由以下组件组成:

  • JScrollPane 向上/向下滚动消息
  • 每条消息都是 JPanel,里面有 JLabel。JLabel 与 HTML 配合得很好,因此很容易将微笑标记更改为 . 消息也由两个字符串构成:发件人姓名和消息。同样,JLabel 中对 HTML 的支持让我们可以用标签标记发件人的姓名。

我认为我被卡住并且聊天 GUI 应该从头开始重新设计的原因:

  • JLabel 与 HTML 一起使用,但如果您使用 JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVER,则其中不再包含任何文字。用 JTextArea 替换 JLabel 不是一个好主意,因为 JTextArea 不适用于 HTML。
  • 添加新消息时,不可能自动向下滚动滚动条。至少我没能做到。
  • 当从服务器接收到新消息时,很难控制组件(带有 JLabels 的 JPanel)的数量来删除旧组件。否则,可以在 10 到 15 分钟的活跃聊天中使用 JLabels 创建数百个 JPanel。WeakReference 在这里很好,但是从一开始就对每条消息使用 JPanel + JLabel 是不好的设计。

还有一些其他问题,但它们并不那么关键,也不会影响“返工决定”。

如果您能根据上述“原因”提示哪些组件非常适合聊天等应用程序,我将不胜感激。

4

1 回答 1

2

你的设计很糟糕,你应该感觉很糟糕。

尝试从一堆连续显示的 JLabel 中复制一些文本。

只需使用 JTextPane 或类似的东西!这个函数来自我的一个程序,在一个扩展 JTextPane 的类中,它在末尾添加了一些文本,具有一些特殊的风格。你可以修改它来做你需要的任何事情。

public void append(String append,Color fg,Color bg, boolean bold,boolean italic, boolean underline) {
    try {
        // Get the text pane's document                        
        StyledDocument doc = (StyledDocument)this.getDocument();

        // The color must first be wrapped in a style
        Style style = doc.addStyle("StyleName", null);
        StyleConstants.setForeground(style, fg);
        StyleConstants.setBackground(style,bg);
        StyleConstants.setBold(style,bold);
        StyleConstants.setItalic(style,italic);
        StyleConstants.setUnderline(style,underline);


        // Insert the text at the end of the text
        doc.insertString(doc.getLength(), append, style);
    } catch (Exception e) {
        e.printStackTrace();
    }

    this.setCaretPosition (this.getDocument().getLength()-1);
}
于 2013-02-24T18:27:05.397 回答