首页 文章

在filechooser的帮助下,JavaFX在Imageview中获取图像存储路径需要帮助D:

提问于
浏览
-1

我的问题是我需要帮助从fxml文件中的imageview中的图像获取路径,因为我需要将图像的路径存储在对象中 . 我正在使用filechooser将图像输入到imageView中 . 我打算将该路径存储到一个对象中,并在稍后的时间将其声明,就像 Profiles 页面会保留 Profiles 图片一样 . 我知道它很简短,但我希望如果你们有任何方式帮助我,我将不胜感激 .

所以根据我编辑的评论: My problem is I cannot claim the URL of the image path although i using a filechooser. 我实际上删除了所有关于我所声称的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+"]";
}

所以这是DAO,我在用户点击注册按钮并存储在OrgRegData.dat文件中后,最后保存文件详细信息 . 就像我说的那样,我的问题是我无法从imagechooser中选择的imageView图像中获取路径并将其存储到我的模型中,即使是作为String也没有getPath()或getURL();点击注册后的一种方法 . 我没有使用数据库或任何只使用文件和文本文件来存储数据和从文件中读取数据,所以我希望现在更清楚我的问题

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 回答

  • 1

    您需要重新考虑存储图像,就像 Image 对象一样 .

    Image 对象不包含任何有关路径的信息(正如您已经发现的那样),因为您可以从任何 InputStream 加载它,并且可能无法使用 URL 访问 InputStream . (例如,图像可以作为blob存储在数据库中,从而进行检索所需的查询...)

    打开文件时,将URL存储在附加字段中 .

    此外,我建议使用 Image 类直接加载图像,否则你在内存中创建一个 BufferedImage 和一个 Image 对象需要大约 . 只有其中一个对象所需的内存的两倍;无论如何, BufferedImage 在方法返回后立即可用于垃圾收集......

    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;
        ...
    }
    

    请注意,如果在fxml中添加默认图像,则需要使用此URL初始化 imageUrl .

相关问题