0

実際、理論的な知識が役立つように、積極的にスイングの練習を始めています:)チャットGUIの実装についてはすでに多くのことを行っていますが、最終的にはいくつかの問題に悩まされています。そこで、チャットGUIを最初から作り直すことにしましたが、そのためのコンポーネントを正しく選択する必要があります。

最初に、最初の実装には「入力」機能がないことを言わなければなりません。

私の現在のチャットの実装は、次のコンポーネントで構成されています。

  • メッセージを上下にスクロールするJScrollPane
  • 各メッセージは、JLabelが含まれているJPanelです。JLabelはHTMLでうまく機能するため、smilesトークンをに簡単に変更できます。また、メッセージは、送信者の名前とメッセージの2つの文字列から構成されます。繰り返しになりますが、JLabelでHTMLをサポートすると、送信者の名前にタグを付けることができます。

私が立ち往生していると思う理由とチャットGUIは最初から作り直す必要があります:

  • JLabelはHTMLで機能しますが、JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVERを使用すると、単語が折り返されることはありません。JLabelをJTextAreaに置き換えることはお勧めできません。これは、JTextAreaがHTMLで機能しないためです。
  • 新しいメッセージが追加されたときにスクロールバーを自動的に下にスクロールする可能性はありません。少なくとも私はそれをなんとかすることができませんでした。
  • サーバーから新しいメッセージを受信したときに古いコンポーネントを削除するために、コンポーネント(JLabelsを使用するJPanels)の量を制御することは困難です。それ以外の場合は、アクティブなチャットで10〜15分でJLabelを使用して数百の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 に答える