目錄
前言
在看了衆多的桌面開發語言後,如java swing ,javaFX 這兩者都是採用java的,Electron是語言node.js的支持,現成的嵌套框架easy-window,C#(大學學過這門語言,但時隔今日已忘得差不多了)綜合上面幾種語言的研究和自身的現狀,我果斷選擇了javaFx,畢竟是搞java的,學習這個應該不是很難,又因swing有些陳舊,故選擇了javafx。我想要的效果是此桌面程序能夠有置頂的效果,能夠去掉原始的框架,自定義框架,這樣寫出來的界面才能加好看些。
開發環境
操作系統 | windows10 |
JDK |
1.8.0_221 x32 (需要兼容最低版本XP32) |
開發工具 | IntelliJ IDEA 2019.1.3 x64 |
開發過程
如何建立javaFx項目
新建項目 - 選擇:Java FX - JDK使用1.8 - 點擊下一步 - 填寫項目名
集成maven
在項目名稱上面右鍵 - 選擇:添加框架支持(第二個-本人已漢化) - 下面找到 :Maven - 確定 ---右下角自動導入
我的目錄結構(resources中存放的是xml文件以及其他靜態文件,通過文件名即可只能文件內容)
集成maven後項目無法找到xml資源
在pom.xml文件中添加一下代碼,這樣做是爲了在測試時獲取到靜態資源
<build>
<resources>
<resource>
<!-- 這裏是放在 src/main/java-->
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.css</include>
<include>**/*.png</include>
<include>**/*.fxml</include>
<include>**/fxml/*.fxml</include>
<!-- 如果想要弄個包名專門放fxml文件,像上一行這樣添加設置 -->
<!-- 之後,使用getResource("fxml/xx.fxml")這樣子 -->
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
如何實現自定義TabPane
經測試,無法實現自定義TabPane只能夠使用所提供的比較難看,爲了解決此問題,我將具體的操作界面使用WebView來開發,引入URL,將較難實現的頁面需求改用HTML開發,這樣一來既能實現頁面效果,有簡化了操作,還能夠在不改動客戶端的前提下更改頁面展示版塊。
如何引入自定義css
<GridPane ··· stylesheets="@../css/search.css">
項目打包exe運行文件(idea版)
Application Class:這個是填寫的main主方法類,這個是程序的入口,無法多言。
Native bundle:中選擇all
下面還有一些其他屬性,這個自己看吧,不在做過多解釋。
報錯:javafx 打包 Error invoking method / Failed to launch JVM
使用dos窗口運行APP目錄下項目名.jar包文件 java -jar “youdaodemo.jar”
錯誤提示中看出,無法找到主方法中的引用
Parent root = FXMLLoader.load(getClass().getResource("../../resources/fxml/search.fxml"));
我是將此引用放在了resources新建的資源中,在開發過程中因直接在idea中運行報錯 見上面的 描述 故需要在此進行調整
項目打包exe運行文件(exe4j版)
使用exe4j打包java jar包運行文件 程序下載地址 https://exe4j.apponic.com/download/
Idea打包jar可運行 https://www.cnblogs.com/blog5277/p/5920560.html
本地配置數據存儲
關於一些本地數據的存儲,如用戶登錄信息或者用戶的配置代理信息需要每次啓動程序去加載用戶上次配置的信息,而減少沒少啓動程序都要重新配置的繁瑣操作。
@FXML
private static int rememberUser = 1;
@Override
public void initialize(URL location, ResourceBundle resources) {
Properties prop = new Properties();
try {
if (new File("config.properties").exists()) {
InputStream in = new BufferedInputStream(new FileInputStream("config.properties"));
prop.load(in);
Iterator<String> it = prop.stringPropertyNames().iterator();
while (it.hasNext()) {
String key = it.next();
serverIp.setText(key);
serverPort.setText(prop.getProperty(key));
}
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
自動生成配置文件,自動存取數據
@FXML
private static int rememberUser = 1;
@Override
public void initialize(URL location, ResourceBundle resources) {
Properties prop = new Properties();
try {
if (new File("config.properties").exists()) {
InputStream in = new BufferedInputStream(new FileInputStream("config.properties"));
prop.load(in);
Iterator<String> it = prop.stringPropertyNames().iterator();
while (it.hasNext()) {
String key = it.next();
serverIp.setText(key);
serverPort.setText(prop.getProperty(key));
}
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
打成exe運行文件包大
原因是因爲在打包時,程序將虛擬機一併打包進去,無需客戶端在此安裝jre運行環境。
在XP系統中提示不是32位應用程序
將idea所使用的JDK版本換成32位,徹底更換
實現歷史搜索記錄下拉框
在javafx中沒有像HTML中的那種絕對定位或者浮動,將div懸浮於其他NODE之上,需要嵌套在父節點內部,隱藏顯示、拉長縮短的操作來實現下拉歷史搜索記錄功能的實現。
注:在進行下拉實現時,對於現有node的縮放應從父節點開始每一層都設置相應的高度,已達到最終要展示的下拉列表的樣式。
自定義窗體風格
primaryStage.initStyle(StageStyle)
StageStyle存在以下幾種類型:
DECORATED | 白色背景,帶有最小化/最大化/關閉等有操作系統平臺裝飾( 默認設置) |
UNDECORATED | 白色背景,沒有操作系統平臺裝飾 |
TRANSPARENT | 透明背景,沒有操作系統平臺裝飾 |
UTILITY | 白色背景,只有關閉操作系統平臺裝飾 |
UNIFIED | 有操作系統平臺裝飾,消除裝飾和內容之間的邊框,內容背景和邊框背景一致 |
窗口最小化以及觸發顯示
爲了保存當前界面查詢的數據信息,首先將當前窗體最小化,在點擊上一個窗體時,觸發此窗體重新顯示在屏幕上面。
最小化代碼:
stage.setIconified(true);
如何才能使最小化窗體在另一個窗體點擊的情況下再此顯示?
CosmosRay |
||
[email protected] |