2014-11-17 3 views
0

제 문제는 JavaFX TableView에서 SHA-256으로 암호화 된 문자열을 표시 할 수 없다는 것입니다. 그것은 정상적인 문자열로 작동합니다. 여기 내 스크램블 방법에 대한 내 코드.JavaFX 테이블 뷰에 스크램블 된 문자열이 표시되지 않습니다.

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 예외가 throw됩니다.

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) 

어떻게 이런 종류의 스크램블 된 문자열이 표시 될 수 있습니까?

@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

digest() 메서드는 바이트 배열을 반환합니다. 이러한 문자는 다이제스트의 문자열 표현의 ASCII 값이 아닙니다. JavaFX가 가지고있는 바이트 값 중 일부에 대해 문자를 렌더링 할 수 없으므로 오류가 발생합니다 (필자는 생각합니다). 귀하의 코멘트에 대한

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", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethan", "Williams", "[email protected]"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]") 
     ); 

    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(); 
     } 
    } 
} 
+0

안녕하세요, 감사 대신

StringBuilder cryptedName = new StringBuilder(); for (byte b : messageDigest.digest()) { cryptedName.append(String.format("%02x", b)); } return cryptedName.toString(); 

의 라인을 따라

cryptedName = new String(messageDigest.digest()); return cryptedName; 

시도 뭔가의

여기에 완벽한 예입니다. 그러나 이것은 작동하지 않습니다. 다른 아이디어? 나는 StringBuffer, StringBuilder 및 SimpleStringproperty를 시도했다. – Freewister

+0

"작동하지 않음"은 전혀 도움이되지 않습니다. 어떻게 작동하지 않습니까? 그것은 컴파일합니까? 예외가 있습니까? 나는 완전한 예제 (어느 것이 효과가 있는가?)로 대답을 업데이트했다. –

+0

안녕하세요, 작동합니다! 고맙습니다 =). 그리고 전에 오류. 코드 줄을 잊어 버린 것 같습니다. – Freewister

관련 문제