2017-01-02 11 views
-1

私の質問は、イメージのパスを保存する必要があるので、fxmlファイルのイメージビュー内のイメージからパスを取得するのに助けが必要ですオブジェクト内に私はfilechooserを使用してimageViewに画像を入力しています。私はオブジェクトにそのパスを保存し、後でプロファイルページがプロファイル画像を保持するようにそれを主張する予定です。私はそれがabit簡潔であることを知っているが、もし皆さんが私を助けてくれる方法があれば、それは感謝します。JavaFXイメージビューアのイメージストアのパスをfilechooserの助けを借りて助けが必要ですD:

私が編集したコメントに基づいて: 私の問題は、私がファイルチョイスを使用しているにもかかわらずイメージパスのURLを要求できないことです。私は実際に私がそれを主張することはできません私が作ったURLの主張に関するすべての関連部分を削除しました。

package orgRegistrationtest; 

public class OrgRegistrationController { 

@FXML 
private JFXHamburger hamburger; 

@FXML 
private JFXTextField email; 

@FXML 
private JFXCheckBox health; 

@FXML 
private JFXCheckBox animal; 

@FXML 
private JFXCheckBox children; 

@FXML 
private JFXCheckBox elderly; 

@FXML 
private JFXCheckBox environment; 

@FXML 
private JFXCheckBox others; 

@FXML 
private JFXTextField name; 

@FXML 
private JFXTextField contact; 

@FXML 
private JFXTextField address; 

@FXML 
private JFXPasswordField password; 

@FXML 
private JFXPasswordField password2; 

@FXML 
private JFXTextArea desc; 

//pic not added 

@FXML 
private ImageView pic; 

@FXML 
private JFXButton upload; 

@FXML 
private JFXButton clear; 

@FXML 
private JFXButton confirm; 

@FXML 
private JFXDrawer drawer; 

@FXML 
void handleClear(ActionEvent event) { 

} 


private String type=null; 



@FXML 

    private void handleConfirmButtonAction(ActionEvent event) throws IOException { 

     if(health.isSelected()) 
      type=health.getText(); 
     if(animal.isSelected()){ 
      type+=";"+animal.getText(); 
     } 
     if(children.isSelected()){ 
      type+=";"+children.getText(); 
     } 
     if(elderly.isSelected()){ 
      type+=";"+elderly.getText(); 
     } 
     if(environment.isSelected()){ 
      type+=";"+environment.getText(); 
      } 
     if(others.isSelected()){ 
      type+=";"+others.getText(); 
     } 

     String Email=email.getText(); 
     String Password = password.getText(); 
     String Password2=password2.getText(); 
     String Name = name.getText(); 
     String Contact= contact.getText(); 
     String Address=address.getText(); 
     String Type = ""+type; 
     String Desc = desc.getText(); 
     //String url = pic.getImage()._____ 
     //.getURL(); i know getURL is not inside same for getPath(); 
     // So how am i able to claim the Path of the Image and store it? 


     OrgData table = new OrgData(Email,Password,Password2,Name, Contact,Address,Type,Desc,url); 

     OrgDataDAO dao = new OrgDataDAO(); 
     dao.createFriend(table); 




} 




@FXML 
public void handleUpload(ActionEvent t) { 
    FileChooser fileChooser = new FileChooser(); 

    //Set extension filter 


    //Show open file dialog 
    File file = fileChooser.showOpenDialog(null); 

    try { 
     BufferedImage bufferedImage = ImageIO.read(file); 
     Image image = SwingFXUtils.toFXImage(bufferedImage, null); 
     pic.setImage(image); 
    } catch (IOException ex) { 
     System.out.println(ex); 
    } 
} 


private Main Main; 

public Main getMainApp() { 
    return Main; 
} 

// setter for mainApp 
public void setMainApp(Main testmainApp) { 
    this.Main = testmainApp; 
} 

これは、請求のそれを整理して、私ができないように私は、私はまだURLの文字列に入れたことがないモデルであり、私がしようとしなかったが、パスを使用しての代わりを行うには良い方法があるかもしれませんそれは私に何も与えません。

public class OrgData implements Serializable { 
private String email, pw, pw2, name, contact, address, type, desc,url; 

final static ObservableList<OrgData> data = FXCollections.observableArrayList(); 


public OrgData(String email, String pw, String pw2, String name, String contact, String address, String type, 
     String desc,String url) { 
    super(); 
    this.email = email; 
    this.pw = pw; 
    this.pw2 = pw2; 
    this.name = name; 
    this.contact = contact; 
    this.address = address; 
    this.type = type; 
    this.desc = desc; 
    //this.url = url; 
} 

//public String getUrl() { 
// return url; 
//} 

//public void setUrl(String url) { 
// this.url= url; 
//} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPw() { 
    return pw; 
} 

public void setPw(String pw) { 
    this.pw = pw; 
} 

public String getPw2() { 
    return pw2; 
} 

public void setPw2(String pw2) { 
    this.pw2 = pw2; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getContact() { 
    return contact; 
} 

public void setContact(String contact) { 
    this.contact = contact; 
} 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public String getType() { 
    return type; 
} 



public String getDesc() { 
    return desc; 
} 

public void setDesc(String desc) { 
    this.desc = desc; 
} 



public static ObservableList<OrgData> getData() { 
    return data; 
} 

public String toString(){ 
    return "["+email+","+pw+","+name+","+contact+","+address+","+type+","+desc+","+url+"]"; 
} 

だからこれは私が登録ボタンをクリックしてOrgRegData.datファイルに保存されたユーザーの後に最後にファイルの詳細情報を保存DAOです。 私の問題は、filechooserから取り出した画像ビューのパスを取得できず、getPath()またはgetURL()が存在しないためStringとしてもモデルに格納されていることです。登録されたメソッドをクリックしてソートします。私は、あなたは画像を保存再考する必要が私の問題で今

public class OrgDataDAO { 
private static final String Friend_File="OrgRegData.dat"; 
private File dataFile; 


public OrgDataDAO() { 
    Path dPath = FileSystems.getDefault().getPath("resources/data/",Friend_File); 
    dataFile=new File(dPath.toString());  
} 

public ObservableList<OrgData> getAllFriends() { 
    Scanner in; 
    String record=null; 
    String[] fields; 
    ImageView[] images; 

    ObservableList<OrgData> friends=FXCollections.observableArrayList();; 
    try { 
     in=new Scanner(dataFile); 
     while (in.hasNextLine()) { 
      record=in.nextLine(); 
      fields=record.split(","); 
      String email=fields[0]; 
      String password=fields[1]; 
      String password2=fields[2]; 
      String name=fields[3]; 
      String contact = fields[4]; 
      String address=fields[5]; 
      String type=fields[6]; 
      String desc=fields[7]; 
      //String url = fields[8]; 

      OrgData f=new OrgData(email,password,password2,name,contact,address,type,desc,url); 
      friends.add(f); 
     } 
     in.close(); 
    } catch (FileNotFoundException e) { 
     System.out.println("No record found!"); 
     //e.printStackTrace(); 
    } 
    return friends; 
} 

/* assuming friend has a unique name, otherwise may return a list */ 
public OrgData getEvent(String email) { 
    // TODO Auto-generated method stub 
    ObservableList<OrgData> event=getAllFriends(); 
    OrgData Event=null; 
    for (OrgData f:event) { 
     if (f.getEmail().equals(email)){ 
      Event=f; 
      break; 
     } 
    } 
    return Event; 
} 

public void updateEvent(OrgData Event) { 
    ObservableList<OrgData> Events=getAllFriends(); 
    for (int i=0; i<Events.size(); i++) { 
     OrgData f=Events.get(i); 
     if (f.getEmail().equals(Event.getEmail())){ 
      Events.set(i, Event); 
     } 
    } 
    synToFile(Events); 
} 

public void deleteEvent(OrgData Event) { 

    ObservableList<OrgData> Events=getAllFriends(); 

    OrgData delEvent=null; 
    for (OrgData f:Events) { 
     if (Event.getEmail().equals(f.getEmail())){ 
      delEvent=f;   
      break; 
     } 
    } 
    if (delEvent!=null){ 
     Events.remove(delEvent); 
     synToFile(Events);  
    }  

} 

public boolean createFriend(OrgData Event) { 
    boolean existing=false; 
    ObservableList<OrgData> Events=getAllFriends(); 
    for (OrgData f:Events) { 
     if (f.getEmail().equals(Event.getEmail())){ 
      existing=true; 
      break; 
     } 
    } 
    if (!existing) { 
     Events.add(Event); 
     synToFile(Events); 
    } 
    return !existing; 
} 

private void synToFile(ObservableList<OrgData> EventList) { 
    if (EventList==null) 
     return; 

    try { 
     FileWriter out = new FileWriter(dataFile); 
     for (OrgData f: EventList) { 
      out.append(f.toString()+"\n"); 
     } 
     out.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+1

あなたはどのような問題を抱えていますか?質問を編集し、関連するコードを追加してください。 –

+0

'FileChooser'からファイルを取得すると、パスが分かります。問題はどこにありますか? – fabian

+0

質問を編集しました。fxmlの外観を後で出すように見せる必要がある場合 – Devilsbats

答えて

1

より明確であるだけでデータを格納するファイルやテキストファイルを使用して、データベースか何かを使用して、ファイルからデータを読み取るので、私は期待していないですちょうどImageオブジェクトと同じです。 (あなたがすでに出て見つけたよう)あなたはどのInputStreamからそれを読み込むことができますし、URLを使用してInputStreamにアクセスする方法がないかもしれないので、

Imageオブジェクトは、パスに関する情報が含まれていません。 (例えば、イメージはデータベースにブロブとして保存され、それを検索するために必要なクエリーを作成することができます...)

ファイルを開くときに、URLを別のフィールドに格納します。

さらに、BufferedImageImageというオブジェクトをメモリに作成すると、画像を直接ロードするためにImageクラスを使用することをお勧めします。それらのオブジェクトの1つのみに必要なメモリの2倍。 BufferedImageあなたはFXMLでデフォルトの画像を追加した場合、あなたはこのURLでimageUrlを初期化する必要があることに注意

private String imageUrl; 

@FXML 
private void handleUpload(ActionEvent t) { 
    FileChooser fileChooser = new FileChooser(); 

    //Set extension filter 


    //Show open file dialog 
    File file = fileChooser.showOpenDialog(null); 
    if (file != null) { 
     try { 
      imageUrl = file.toURI().toURL().toExternalForm(); 
      Image image = new Image(imageUrl); 
      pic.setImage(image); 
     } catch (MalformedURLException ex) { 
      throw new IllegalStateException(ex); 
     } 
    } 
} 

@FXML 
private void handleConfirmButtonAction(ActionEvent event) throws IOException { 

    ... 
    String url = imageUrl; 
    ... 
} 

...とにかくすぐにメソッドの復帰後、ガベージコレクションのために利用可能です。

+0

こんにちは、私は私に与えた答えを試してみました。私はURL(String)イメージオブジェクトを使用するようにあなたの提案を試みていますが、モデルとコントローラで関連する部品を変更できますが、問題はDAOにあります。どのように私はそれを格納し、画像を収集できるように変更することができます。 – Devilsbats

+0

@Devilsbatsイメージデータをファイルに含める必要がありますか?その後、テキストファイルは適切ではありません(ただし、画像データを文字列としてエンコードすることで可能ですが、ファイルをアーカイブに保存する方がよいでしょう)。さもなければ、ファイルはファイルに保存されたURLから構築できます... – fabian

+0

Nevermind、私はあなたが例をたくさん読んだ後に何を意味するのかミックスすると思います。私はもう一度試してみる。 – Devilsbats

関連する問題