1

私の質問ができるだけ明確になることを願っています。GUI用のJavaFXライブラリを使用して、小さなJavaアプリケーションに取り組んでいます。POP接続を行い、メッセージをObservableListとして保存しています。このために、javax.mail を使用しています。このobservablelistをテーブルビューに渡し、次のように必要な値をTableColumnsに渡しています。

        fromColumn.setCellValueFactory(
            new PropertyValueFactory<Message,String>("from")
        );
        subjectColumn.setCellValueFactory(
            new PropertyValueFactory<Message,String>("subject")
        );
        dateColumn.setCellValueFactory(
            new PropertyValueFactory<Message,String>("sentDate")
        );

Subject と sentDate は完全に読み込まれています。しかし残念なことに、"from" はオブジェクト参照を TableColumn に追加しています。これは、Message-Class の From-Attribute が InternetAdress-Object であり、その toString() メソッドが文字列を返すのではなく、おそらく参照を返すためです。結果は、fromColumn に次のように表示されます。

[Ljavax.mail.internet.InternetAddress;@3596cd38

上記の列に表示されている InternetAdress の文字列値を取得する方法を知っている人はいますか?

前もって感謝します

4

3 に答える 3

1

PropertyValueFactory を使用するのではなく、必要な形式でアドレス情報を取得するには、カスタム セル値ファクトリを定義する必要があると思います。

次のサンプルは読み取り専用テーブル用です。テーブル内のメッセージ データを編集可能にする必要がある場合、ソリューションは非常に複雑になります。

fromColumn.setCellValueFactory(new Callback<CellDataFeatures<Message, String>, ObservableValue<String>>() {
    @Override public ObservableValue<String> call(CellDataFeatures<Message, String> m) {
        // m.getValue() returns the Message instance for a particular TableView row
        return new ReadOnlyObjectWrapper<String>(Arrays.toString(m.getValue().getFrom()));
    }
});

以下は、カスタム セル値ファクトリの使用方法を示す実行可能なサンプル (およびサンプル データ ファイル) です。サンプル データ ファイルをアプリケーション Java プログラムと同じディレクトリに配置し、ビルド システムがサンプル ファイルを、アプリケーション用にコンパイルされたクラス ファイルを含むビルド出力ディレクトリにコピーすることを確認します。アプリケーションをコンパイルして実行するには、パスにjavamail jar ファイルが必要です。

import java.io.*;
import java.util.Arrays;
import java.util.logging.*;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
import javax.mail.*;
import javax.mail.internet.MimeMessage;

public class MailTableSample extends Application {
  private TableView<Message> table = new TableView<Message>();
  public static void main(String[] args) { launch(args);}

  @Override public void start(Stage stage) {
    stage.setTitle("Table View Sample");

    final Label label = new Label("Mail");
    label.setFont(new Font("Arial", 20));

    table.setEditable(false);

    TableColumn subjectColumn = new TableColumn("Subject");
    subjectColumn.setMinWidth(100);
    subjectColumn.setCellValueFactory(
      new PropertyValueFactory<Message, String>("subject")
    );

    TableColumn sentDate = new TableColumn("Sent");
    sentDate.setMinWidth(100);
    sentDate.setCellValueFactory(
      new PropertyValueFactory<Message, String>("sentDate")
    );

    TableColumn fromColumn = new TableColumn("From");
    fromColumn.setMinWidth(200);
    fromColumn.setCellValueFactory(new Callback<CellDataFeatures<Message, String>, ObservableValue<String>>() {
        @Override public ObservableValue<String> call(CellDataFeatures<Message, String> m) {
          try {
            // m.getValue() returns the Message instance for a particular TableView row
            return new ReadOnlyObjectWrapper<String>(Arrays.toString(m.getValue().getFrom()));
          } catch (MessagingException ex) {
            Logger.getLogger(MailTableSample.class.getName()).log(Level.SEVERE, null, ex);
            return null;
          }
        }
    });    

    table.setItems(fetchMessages());
    table.getColumns().addAll(fromColumn, subjectColumn, sentDate);
    table.setPrefSize(600, 200);

    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10));
    vbox.getChildren().addAll(label, table);

    stage.setScene(new Scene(vbox));
    stage.show();
  }

  private ObservableList<Message> fetchMessages() {
    ObservableList<Message> messages = FXCollections.observableArrayList();
    try {
      Session session = Session.getDefaultInstance(System.getProperties());
      for (int i = 0; i < 3; i++) {
        InputStream mboxStream = new BufferedInputStream(
          getClass().getResourceAsStream("msg_" + (i+1) + ".txt")
        );
        Message message = new MimeMessage(session, mboxStream);
        messages.add(message);
      }
    } catch (MessagingException ex) {
      Logger.getLogger(MailTableSample.class.getName()).log(Level.SEVERE, null, ex);
    }

    return messages;
  }
}

msg_1.txt

From cras@irccrew.org  Tue Jul 23 19:39:23 2002
Received: with ECARTIS (v1.0.0; list dovecot); Tue, 23 Jul 2002 19:39:23 +0300 (EEST)
Return-Path: <cras@irccrew.org>
Delivered-To: dovecot@procontrol.fi
Received: from shodan.irccrew.org (shodan.irccrew.org [80.83.4.2])
    by danu.procontrol.fi (Postfix) with ESMTP id 434B423848
    for <dovecot@procontrol.fi>; Tue, 23 Jul 2002 19:39:23 +0300 (EEST)
Received: by shodan.irccrew.org (Postfix, from userid 6976)
    id 175FA4C0A0; Tue, 23 Jul 2002 19:39:23 +0300 (EEST)
Date: Tue, 23 Jul 2002 19:39:23 +0300
From: Timo Sirainen <tss@iki.fi>
To: dovecot@procontrol.fi
Subject: [dovecot] first test mail
Message-ID: <20020723193923.J22431@irccrew.org>
Mime-Version: 1.0
Content-Disposition: inline
User-Agent: Mutt/1.2.5i
Content-Type: text/plain; charset=us-ascii
X-archive-position: 1
X-ecartis-version: Ecartis v1.0.0
Sender: dovecot-bounce@procontrol.fi
Errors-to: dovecot-bounce@procontrol.fi
X-original-sender: tss@iki.fi
Precedence: bulk
X-list: dovecot
X-IMAPbase: 1096038620 0000010517
X-UID: 1                                                  
Status: O

lets see if it works

msg_2.txt

From cras@irccrew.org  Mon Jul 29 02:17:12 2002
Received: with ECARTIS (v1.0.0; list dovecot); Mon, 29 Jul 2002 02:17:12 +0300 (EEST)
Return-Path: <cras@irccrew.org>
Delivered-To: dovecot@procontrol.fi
Received: from shodan.irccrew.org (shodan.irccrew.org [80.83.4.2])
    by danu.procontrol.fi (Postfix) with ESMTP id 8D21723848
    for <dovecot@procontrol.fi>; Mon, 29 Jul 2002 02:17:12 +0300 (EEST)
Received: by shodan.irccrew.org (Postfix, from userid 6976)
    id 8BAD24C0A0; Mon, 29 Jul 2002 02:17:11 +0300 (EEST)
Date: Mon, 29 Jul 2002 02:17:11 +0300
From: John Smith <jsmithspam@yahoo.com>
To: dovecot@procontrol.fi
Subject: [dovecot] Dovecot 0.93 released
Message-ID: <20020729021711.W22431@irccrew.org>
Mime-Version: 1.0
Content-Disposition: inline
User-Agent: Mutt/1.2.5i
Content-Type: text/plain; charset=us-ascii
X-archive-position: 2
X-ecartis-version: Ecartis v1.0.0
Sender: dovecot-bounce@procontrol.fi
Errors-to: dovecot-bounce@procontrol.fi
X-original-sender: tss@iki.fi
Precedence: bulk
X-list: dovecot
X-UID: 2                                                  
Status: O

First alpha quality release, everything critical is now implemented. From
now on it's mostly stabilization and optimization. Features that can't break
existing code could still be added, especially SSL and authentication stuff.

msg_3.txt

From cras@irccrew.org  Wed Jul 31 22:48:41 2002
Received: with ECARTIS (v1.0.0; list dovecot); Wed, 31 Jul 2002 22:48:41 +0300 (EEST)
Return-Path: <cras@irccrew.org>
Delivered-To: dovecot@procontrol.fi
Received: from shodan.irccrew.org (shodan.irccrew.org [80.83.4.2])
    by danu.procontrol.fi (Postfix) with ESMTP id F141123829
    for <dovecot@procontrol.fi>; Wed, 31 Jul 2002 22:48:40 +0300 (EEST)
Received: by shodan.irccrew.org (Postfix, from userid 6976)
    id 42ED44C0A0; Wed, 31 Jul 2002 22:48:40 +0300 (EEST)
Date: Wed, 31 Jul 2002 22:48:39 +0300
From: Timo Sirainen <tss@iki.fi>
To: dovecot@procontrol.fi
Subject: [dovecot] v0.95 released
Message-ID: <20020731224839.H22431@irccrew.org>
Mime-Version: 1.0
Content-Disposition: inline
User-Agent: Mutt/1.2.5i
Content-Type: text/plain; charset=us-ascii
X-archive-position: 3
X-ecartis-version: Ecartis v1.0.0
Sender: dovecot-bounce@procontrol.fi
Errors-to: dovecot-bounce@procontrol.fi
X-original-sender: tss@iki.fi
Precedence: bulk
X-list: dovecot
X-UID: 3                                                  
Status: O

v0.95 2002-07-31  Timo Sirainen <tss@iki.fi>

    + Initial SSL support using GNU TLS, tested with v0.5.1.
      TLS support is still missing.
    + Digest-MD5 authentication method
    + passwd-file authentication backend
    + Code cleanups
    - Found several bugs from mempool and ioloop code, now we should
      be stable? :)
    - A few corrections for long header field handling

プログラム出力の例: メール メッセージ情報を含むサンプル TableView

于 2012-11-01T21:31:16.813 に答える
0

これは、jewelsea のソリューションの Java 8 バージョンですが、すばらしいラムダ式です。

fromColumn.setCellValueFactory(m -> {
        // m.getValue() returns the Message instance for a particular TableView row
        return new ReadOnlyObjectWrapper<String>(Arrays.toString(m.getValue().getFrom()));
    }
});

笑、ラムダが大好き

于 2016-01-04T22:22:05.020 に答える
0

上記のソリューションを使用して、それをそのまま使用するか、Eclipse のアドバイスを受け入れるかにかかわらず、try/catch とさらに戻り値を追加します。これは最後に次のようになります。

        fromColumn.setCellValueFactory(new Callback<CellDataFeatures<Message, String>, ObservableValue<String>>() {
        public ObservableValue<String> call(CellDataFeatures<Message, String> m) {
            // m.getValue() returns the Message instance for a particular TableView row
            try {
                return new ReadOnlyObjectWrapper<String>(Arrays.toString(m.getValue().getFrom()));
            } catch (MessagingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    });

結果は同じです。(視覚的に) 空のテーブルビューが表示されます。これは、この setCellFactury() ソリューションを使用して tablecolumns も空であることを意味します。回避策として、3 つの値をすべて文字列として格納できるクラスを定義し、それを PropertyValueFactory を使用して setCellValueFactory() に渡すことができますが、適切に処理されることを願っています。

さらにアドバイスはありますか?

よろしくお願いします

于 2012-11-02T07:51:25.133 に答える