2 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
Maven 約定使用標(biāo)準(zhǔn)目錄布局,除非另有配置,否則要求您遵循它。標(biāo)準(zhǔn)目錄布局所做的一件事是將 Java 源文件 ( .java) 與資源文件(所有不是.java)分開。它看起來像這樣:
|--projectDir/
| |--src/
| | |--main/
| | | |--java/
| | | |--resources/
源文件進(jìn)去,src/main/java
資源文件進(jìn)去src/main/resources
。
構(gòu)建項(xiàng)目時(shí),Maven 將編譯源文件并將.class
文件放入projectDir/target/classes
. 它也將復(fù)制任何資源文件src/main/resources
到target/classes
為好。默認(rèn)情況下,任何非源文件都src/main/java
將被忽略。您提到您已將styles.css
文件放入其中src/main/java
,因此在target/classes
您運(yùn)行項(xiàng)目時(shí)它不在。
當(dāng)您執(zhí)行項(xiàng)目時(shí),目錄target/classes
(以及任何依賴項(xiàng))都放在類路徑上。但是因?yàn)槟愕?code>styles.css文件沒有被復(fù)制到target/classes
它里面,所以它不包含在類路徑中,NullPointerException
當(dāng)你試圖引用它時(shí),你最終會(huì)得到s 。
解決方法是將styles.css
文件移動(dòng)到src/main/resources
目錄中??雌饋砟壳霸?code>src/main/java/rocks/zipcode/atm. 如果要將資源文件保留在同一個(gè)“包”中,請將其移動(dòng)到src/main/resources/rocks/zipcode/atm
. 然后target/classes
在重建項(xiàng)目時(shí)應(yīng)該將其復(fù)制到目錄中。
然后你可以通過幾種方式引用它。
第一種方法是使用getClass().getResource(...)
. 如果您傳遞絕對路徑(以 a 開頭/
),它將從類路徑的根目錄查找資源。如果您不傳遞絕對路徑(不以 a 開頭/
),它將查找相對于Class
's 位置的資源(在這種情況下, theClass
是 返回的那個(gè)getClass()
)。這意味著,由于您是從 inside 獲取資源rocks.zipcode.atm.CacheMachineApp
,您可以執(zhí)行以下操作:
getClass().getResource("/rocks/zipcode/atm/styles.css")
, 或者getClass().getResource("styles.css")
另一種選擇是使用文檔中定義的行為getStylesheets()
:
獲取鏈接到樣式表的字符串 URL 的可觀察列表,以用于此場景的內(nèi)容。
URL 是 [scheme:][//authority][path] 形式的分層 URI。如果 URL 沒有 [scheme:] 組件,則該 URL 僅被視為 [path] 組件。[path] 的任何前導(dǎo)“/”字符都將被忽略,并且 [path] 被視為相對于應(yīng)用程序類路徑的根的路徑。
如您所見,當(dāng)沒有方案(例如file:
,,https:
等)時(shí),它將尋找相對于類路徑的根的資源。由于它始終相對于根,因此您需要傳遞絕對路徑(但在這種情況下它不需要前導(dǎo)/
)。
getStylesheets().add("rocks/zipcode/atm/styles.css");
重要說明:確保路徑完全正確。打包在 JAR 文件中時(shí)區(qū)分大小寫。當(dāng)不打包在 JAR 文件中時(shí),它可能區(qū)分大小寫,也可能不區(qū)分大小寫,但這取決于底層文件系統(tǒng)。無論哪種方式,最好匹配實(shí)際路徑的大小寫,以避免出現(xiàn)任何問題。

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您的 css 文件位于您班級(jí)的同一個(gè)包中:
scene.getStylesheets().add(getClass().getResource("style.css").toString());
添加回答
舉報(bào)