因此,正如帖子的標題所說,我正在尋求一種方法,可以將我使用 FileChooser 上傳到專案目錄中的檔案說出來。
更具體地說,我正在上傳影像,我想將它們保存在我的專案中,以便將來使用它們。這是一個示例代碼:
控制器:
package org.example;
import javafx.fxml.FXML;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import java.io.File;
public class PrimaryController {
@FXML
private ImageView image;
@FXML
void handleUploadImage() {
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Image Files", "*.jpg", "*.jpeg", "*.png", "*.svg"));
File file = fileChooser.showOpenDialog(null);
if (file != null) {
image.setImage(new Image(String.valueOf(file)));
} else {
System.out.println("It's null");
}
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: linear-gradient(to right, #1c92d2, #f2fcfe);" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.example.PrimaryController">
<children>
<ImageView fx:id="image" fitHeight="200.0" fitWidth="200.0" layoutX="200.0" layoutY="100.0" onm ouseClicked="#handleUploadImage" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../images/upload.png" />
</image>
<cursor>
<Cursor fx:constant="HAND" />
</cursor>
</ImageView>
</children>
</AnchorPane>
我的目錄:
我想將影像保存在/resources/images
. 我該怎么做?
uj5u.com熱心網友回復:
背景資料
該檔案沒有被“上傳”。該術語通常用于將檔案發送到托管云服務或 FTP 站點等操作。您的代碼選擇可通過本地機器的檔案系統獲得的檔案。然后你想用它做點什么。可能將其復制到本地的另一個位置。我想您可能會選擇“上傳”該程序,但是,對我來說,該術語似乎并不適合。
通常,在部署 JavaFX 應用程式時,其所有代碼和資源都將打包在一起,例如打包在 jar 檔案、安裝程式或 jlink 映像中。您的專案源代碼的資源目錄將不存在,但它的內容將已復制到包中。在運行時向該位置添加額外資源是一個未定義的操作,因為您并不真正知道資源將去往何處。
建議的替代方案:保存到已知的本地檔案位置
您可能想要做的是將檔案復制到機器上的知名位置并從那里訪問它。一種方法是.myapp
在用戶的主目錄下創建一個目錄(例如),將所選檔案復制到該目錄中,然后根據需要從那里讀取和寫入檔案。您可以使用java 系統屬性確定用戶的主目錄。
常問問題
這真的沒有任何意義。如果我愿意允許用戶上傳影像然后將影像保存在我的電腦或專案中的某個位置,那么我必須做什么?
據推測,您的“專案”是您在問題中顯示的源代碼目錄。如前所述,該目錄在本地開發環境之外的運行時不可用。所以你不能在運行時將檔案保存到專案中,因為它不存在。相反,您需要“將影像保存在我的電腦上的某個位置”。一種方法是遵循我提供的關于將影像放置在應用程式在用戶主目錄中創建的特定于應用程式的子目錄的建議。
該解決方案是否適用于全球?就像這個專案不只是為了我,意味著它會被發送給一些人,所以他們不會有我保存檔案的目錄。
他們將有一個用戶目錄,因為這就是作業系統的作業方式。這可以從我鏈接的系統屬性中獲得。如果您按照應用程式的路線創建并根據需要使用用戶目錄下的應用程式特定子目錄,那么您可以確保所需的目錄將存在。作業系統中針對不同位置的存盤還有其他約定,但我真的建議您只使用用戶目錄下的特定于應用程式的目錄,除非您需要做其他事情。還有其他選項,例如上傳到云托管影像服務,但除非您需要,否則不要這樣做。
另外,在專案中,我將我使用的所有影像放在一個目錄中,該目錄存在于例如 /resources/images 目錄中,我需要將影像保存在其中。
如前所述,您不能在運行時動態地執行此操作。您需要將動態添加的影像放在其他地方(例如,在用戶本地目錄、云服務、共享資料庫等下)。你需要從同一個地方讀取這些檔案。如果將它們放在用戶目錄下,則可以使用檔案 URL 或檔案 API 而不是 getResource 來讀取和寫入檔案。
uj5u.com熱心網友回復:
經過多次搜索,我得到了我的問題的答案。總之,就像jewelsea解釋的那樣,但他沒有為我的問題提供代碼或真正好的解釋,所以在這里我提供一個示例代碼可能會有所幫助:
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Image Files", "*.jpg", "*.jpeg", "*.png"));
File file = fileChooser.showOpenDialog(null);
if (file != null) {
File file1 = new File(file.getAbsolutePath());
BufferedImage bufferedImage = ImageIO.read(file1);
String fileName = file.getName();
if (fileName.endsWith("png") || fileName.endsWith("jpg")) {
fileName = fileName.substring(fileName.length() - 3);
} else { // This is for .jpeg
fileName = fileName.substring(fileName.length() - 4);
}
String path = System.getProperty("user.dir") "\\src\\main\\resources\\Image\\" file.getName();
File file2 = new File(path);
ImageIO.write(bufferedImage, fileName, file2);
}
我將影像保存在我的專案中的 \src\main\resources\Image 檔案夾中,我從專案中拍攝照片。但是,請注意,在添加檔案之后,正如 Jewelsea 解釋的那樣,必須重新加載舞臺才能應用更改,因為它無法識別檔案,因為它在檔案添加到之前加載了專案所以根據它檔案/image 目前沒有定義,它被視為 null。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480339.html
上一篇:如何訪問主代碼塊中的區域變數?