2

JTextArea特定のメッセージを表示する GUI を開発しています。ここには 2 種類のメッセージが表示される可能性があります。ユーザー向けに意図的に書かれたメッセージ ( 「タスクが完了しました」「ファイルが見つかりません」「お待ちください」など) と、開発者向けのメッセージ (例外、警告、ヘルプに関する情報) です。メッセージ...)。

  • これまでのところ、 に関する情報を表示するための 2 つのオプションを検討しています。メソッドをJTextArea使用するか、出力ストリームを使用して にリダイレクトします。setText()System.out.print()JTextArea

どちらのオプションが優れていますか? なんで?


  • に表示するメッセージの種類をユーザーが選択できるようにするシステムを実装するにはどうすればよいJTextAreaですか? のようなJComboBoxさまざまなオプションがあるため、ユーザーは、アプリケーション メッセージだけを取得するか、ワークフローに関連するメッセージ (警告、例外など) を取得するかを選択できます。
4

2 に答える 2

4
  1. 私はただ使用しますsetText()。を使用System.out.println()してリダイレクトすると、JTextArea必要以上に複雑になります。
  2. メッセージを収集するコンポーネントがある場合 (メッセージは によって表示されますJTextArea)、それを変更して、メッセージだけでなくCategory. の内容によってはJComboBox、特定のメッセージのみCategoryが 内に表示されますJTextArea

多少異なるアプローチを提案する場合: アプリケーション内で Log4J や Logback などを使用してメッセージをログに記録している可能性があります。にリダイレクトするロギング フレームワークのカスタム アペンダーを登録できる可能性がありますJTextArea。このアプローチは、実行するのに少し手間がかかるかもしれませんが、柔軟性が向上し、既存の車輪を再発明する必要がなくなります。

これを行う方法についての私の2セントは、のようなものを持つことですFeedbackManager(私は名前を作ったので、自由にもっと良い名前を作ってください). これFeedbackManagerはシングルトンであり、それを使用するすべてのクラスが同じインスタンスを参照します。ユーザーにメッセージを表示する必要があるときはいつでもFeedbackManager、 を含むに投稿しますCategory(上記を参照)。がFeedbackManagerを受信するMessageと、新しいメッセージが投稿されたことをすべてのリスナーに通知する必要があります。

をインスタンス化するときにJTextArea、匿名リスナーを に登録しFeedbackManagerます。リスナーが呼び出されると、 の選択に基づいてメッセージを表示する必要があるかどうかを確認できます。必要なJComboBox場合は、 に追加しますJTextArea

于 2013-07-24T07:58:40.793 に答える
4

追加のロギング ライブラリを使用したくない場合 (プログラムが小さい場合、または (アプレットなどで) スペースを節約する必要がある場合)、いつでも JSE のロギングを使用できます: java.util .logging. その場合、ハンドラーを使用してテキスト コンポーネントに書き込むことができます。

final class TextComponentHandler extends Handler {
  @Nonnull private final JTextArea text;
    TextComponentHandler(@Nonnull JTextArea text) {
      this.text = text;
    }
  @Override
  public void publish(LogRecord record) {
    if (isLoggable(record))
      synchronized(text) {
        text.append(getFormatter().format(record));
      }
  }
  @Override
  public void flush() {/**/}
  @Override
  public void close() throws SecurityException {/**/}
}

そしてそれを追加します:

JTextArea textArea = new JTextArea() {
  @Override
  public void addNotify() {
    super.addNotify();
    for(Handler hh : logger.getHandlers())
      if (hh == h)
        return;
    logger.addHandler(h);
  }
  @Override
  public void removeNotify() {
    super.removeNotify();
    logger.removeHandler(h);
  }
};
Logger logger = Logger.getLogger("my.logger");
Handler h = new TextComponentHandler(textArea);
logger.addHandler(h);
于 2013-07-24T17:56:18.137 に答える