如何在JavaFX TableView展示前将byte[]转为自定义十六进制字符串?
解决JavaFX TableView中byte[]转十六进制字符串的展示问题
方案一:在Transaction类中添加转换后的只读属性
这种方式适合需要在多处复用转换后值的场景,直接在实体类中封装转换逻辑:
修改Transaction类,新增返回十六进制字符串的get方法:
public class Transaction implements Serializable { private transient byte[] txId; private byte[] sender; private byte[] receiver; private double amount; // 获取txId的十六进制字符串 public String getTxIdHex() { return txId != null ? YourUtilClass.digestToHex(txId) : ""; } // 获取sender的十六进制字符串 public String getSenderHex() { return sender != null ? YourUtilClass.digestToHex(sender) : ""; } // 获取receiver的十六进制字符串 public String getReceiverHex() { return receiver != null ? YourUtilClass.digestToHex(receiver) : ""; } // 保留原有getter方法(按需添加) public byte[] getTxId() { return txId; } public byte[] getSender() { return sender; } public byte[] getReceiver() { return receiver; } public double getAmount() { return amount; } }
然后更新TableView的列配置,使用新的属性名:
@FXML void refreshButtonPressed(ActionEvent event) { List<Transaction> incomingList = DependencyManager.getAccountStorage().getAccount(publicKey).getIncomingTransactions(); incomingTransactions = FXCollections.observableList(incomingList); idCol.setCellValueFactory(new PropertyValueFactory<Transaction, String>("txIdHex")); senderCol.setCellValueFactory(new PropertyValueFactory<Transaction, String>("senderHex")); receiverCol.setCellValueFactory(new PropertyValueFactory<Transaction, String>("receiverHex")); // 注意amount类型应为Double,而非String,PropertyValueFactory会自动处理展示 amountCol.setCellValueFactory(new PropertyValueFactory<Transaction, Double>("amount")); incomingView.setItems(incomingTransactions); }
方案二:自定义TableCell实现转换(无需修改实体类)
如果不想改动Transaction类,可直接在TableView的列中自定义单元格渲染逻辑,适合临时或单一展示场景:
@FXML void refreshButtonPressed(ActionEvent event) { List<Transaction> incomingList = DependencyManager.getAccountStorage().getAccount(publicKey).getIncomingTransactions(); incomingTransactions = FXCollections.observableList(incomingList); // 配置txId列:先绑定byte[]属性,再自定义单元格转换为十六进制 idCol.setCellValueFactory(new PropertyValueFactory<Transaction, byte[]>("txId")); idCol.setCellFactory(column -> new TableCell<Transaction, byte[]>() { @Override protected void updateItem(byte[] item, boolean empty) { super.updateItem(item, empty); setText(empty || item == null ? "" : YourUtilClass.digestToHex(item)); } }); // sender列同理 senderCol.setCellValueFactory(new PropertyValueFactory<Transaction, byte[]>("sender")); senderCol.setCellFactory(column -> new TableCell<Transaction, byte[]>() { @Override protected void updateItem(byte[] item, boolean empty) { super.updateItem(item, empty); setText(empty || item == null ? "" : YourUtilClass.digestToHex(item)); } }); // receiver列同理 receiverCol.setCellValueFactory(new PropertyValueFactory<Transaction, byte[]>("receiver")); receiverCol.setCellFactory(column -> new TableCell<Transaction, byte[]>() { @Override protected void updateItem(byte[] item, boolean empty) { super.updateItem(item, empty); setText(empty || item == null ? "" : YourUtilClass.digestToHex(item)); } }); amountCol.setCellValueFactory(new PropertyValueFactory<Transaction, Double>("amount")); incomingView.setItems(incomingTransactions); }
注:
YourUtilClass需替换为你实际存放digestToHex方法的工具类名称。
内容的提问来源于stack exchange,提问作者Thriest
相关产品推荐
相关产品推荐

