我的问题是我的JavaFX TableView无法显示使用SHA-256加密的字符串。它适用于普通字符串。这是我的争夺方法的代码。
private String scrambleName(String name, String surname)
{
MessageDigest messageDigest;
String cryptedName;
StringBuilder builder = new StringBuilder();
builder.append(name);
builder.append(" ");
builder.append(surname);
String fullName = builder.toString();
try
{
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(fullName.getBytes());
cryptedName = new String(messageDigest.digest());
return cryptedName;
} catch (NoSuchAlgorithmException ex)
{
Logger.getLogger(Scrambler.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
此方法为我的加扰投票对象返回一个字符串。
public class ScrambledVote
{
private int key;
private String scrambledName;
private int age;
private String party;
public ScrambledVote(int key, String scrambledName, int age, String party)
{
this.key = key;
this.scrambledName = scrambledName;
this.age = age;
this.party = party;
}
//Getter Setter
我从文件加载数据。命令行输出正常。但TableView引发了异常。
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: 0
at com.sun.javafx.font.directwrite.DWGlyphLayout.getIndices(DWGlyphLayout.java:198)
at com.sun.javafx.font.directwrite.DWGlyphLayout.renderShape(DWGlyphLayout.java:401)
at com.sun.javafx.font.directwrite.DWGlyphLayout.layout(DWGlyphLayout.java:154)
at com.sun.javafx.text.PrismTextLayout.shape(PrismTextLayout.java:832)
at com.sun.javafx.text.PrismTextLayout.layout(PrismTextLayout.java:1062)
at com.sun.javafx.text.PrismTextLayout.ensureLayout(PrismTextLayout.java:221)
at com.sun.javafx.text.PrismTextLayout.getBounds(PrismTextLayout.java:244)
at com.sun.javafx.scene.control.skin.Utils.computeTextHeight(Utils.java:129)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.computePrefHeight(LabeledSkinBase.java:832)
at javafx.scene.control.Control.computePrefHeight(Control.java:543)
at javafx.scene.Parent.prefHeight(Parent.java:918)
at javafx.scene.layout.Region.prefHeight(Region.java:1438)
at com.sun.javafx.scene.control.skin.TableRowSkinBase.computePrefHeight(TableRowSkinBase.java:544)
at javafx.scene.control.Control.computePrefHeight(Control.java:543)
at javafx.scene.Parent.prefHeight(Parent.java:924)
at javafx.scene.layout.Region.prefHeight(Region.java:1438)
at com.sun.javafx.scene.control.skin.VirtualFlow.resizeCellSize(VirtualFlow.java:1782)
at com.sun.javafx.scene.control.skin.VirtualFlow.addTrailingCells(VirtualFlow.java:1212)
at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1102)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Scene.doLayoutPass(Scene.java:576)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2386)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:321)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:319)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:319)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:348)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:745)
我的TableView如何显示这种混乱的字符串?
@FXML
protected void loadFile()
{
allScrambledVotes.clear();
HashTable hashTable = new HashTable(txtPath.getText());
LinkList[] allVotes = hashTable.getArray();
Scrambler scrambler = new Scrambler();
int k = 0;
for (LinkList vote : allVotes)
{
for (int j = 0; j < vote.getSize(); j++)
{
Vote v = vote.findVote(j);
scrambler.put(k, v);
allScrambledVotes.add(scrambler.get(k));
System.out.println(allScrambledVotes.get(k));
k++;
}
}
table.setItems(allScrambledVotes);
System.out.println("Hello World");
}
我忘记了我的loadFile方法。我用自己的函数从哈希表中加载数据。在Hello World sysout之后发生错误。
答案 0 :(得分:0)
digest()
方法返回一个字节数组:这些不是摘要的字符串表示形式的ascii值。您正在收到错误(我认为),因为JavaFX无法为您拥有的某些字节值呈现字符。
而不是
cryptedName = new String(messageDigest.digest());
return cryptedName;
按照
的方式尝试StringBuilder cryptedName = new StringBuilder();
for (byte b : messageDigest.digest()) {
cryptedName.append(String.format("%02x", b));
}
return cryptedName.toString();
这是一个完整的例子:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javafx.application.Application;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com")
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
TableColumn<Person, String> emailCol = new TableColumn<>("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
TableColumn<Person, String> digestCol = new TableColumn<>("Digest");
digestCol.setMinWidth(200);
digestCol.setCellValueFactory(
new PropertyValueFactory<>("digestedName"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol, digestCol);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private final MessageDigest digest ;
private final ReadOnlyStringWrapper digestedName ;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
throw new Error(e);
}
this.digestedName = new ReadOnlyStringWrapper();
digestedName.bind(new StringBinding() {
{
bind(firstName, lastName);
}
@Override
public String computeValue() {
String fullName = getFirstName() + " " + getLastName();
return scrambleName(fullName);
}
});
}
private String scrambleName(String fullName) {
digest.update(fullName.getBytes());
StringBuilder result = new StringBuilder();
for (byte b : digest.digest()) {
result.append(String.format("%02x", b));
}
return result.toString();
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
public String getDigestedName() {
return digestedName.get();
}
}
}