希望我能把我的问题说得尽可能清楚。我正在开发一个小型的java应用程序,使用的是gui的JavaFX库。我正在做POP连接,并将消息存储为ObservableList。为此,我使用javax.mail。我将此可观察列表传递给一个表视图,并使用以下内容将所需的值传递给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属性是InternetAdress-Object,并且它的toString()-method不返回字符串,而可能返回引用。结果是在fromColumn中显示了以下内容:
[Ljavax.mail.internet.InternetAddress;@3596cd38有人知道如何获得上述列中显示的InternetAdress的字符串值的解决方案吗?
提前感谢
发布于 2012-11-02 05:31:17
我认为您需要定义一个自定义单元格值工厂,以获取所需格式的地址信息,而不是使用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 worksmsg_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示例程序输出:

发布于 2012-11-02 15:51:25
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()-solution,即使是表列也是空的。
有什么进一步的建议吗?
诚挚的问候
发布于 2016-01-05 06:22:05
这是一个Java 8版本的珠海解决方案,但是使用了非常棒的lambdas:
fromColumn.setCellValueFactory(m -> {
// m.getValue() returns the Message instance for a particular TableView row
return new ReadOnlyObjectWrapper<String>(Arrays.toString(m.getValue().getFrom()));
}
});哈哈,我喜欢lambdas
https://stackoverflow.com/questions/13185254
复制相似问题