欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Eclipse编写JavaFX应用

程序员文章站 2024-02-06 23:08:34
...

  JavaFX是由Oracle推出的用于创建Rich Internet application的技术。JavaFX可以制作桌面应用,配合Scene Builder可以很方面的制作界面。
  jdk8是包含JavaFX的,但是在jdk11中成为独立的一个部分,因此需要在工程中引入相关的jar文件。
  在Eclipse中编写JavaFX应用需要下载E(fx)clipse,以及用于可视化布局操作的Scene Builder。E(fx)clipse 可以在Eclipse的marketplace中下载
使用Eclipse编写JavaFX应用
Scene Builder的下载链接
整个项目是按照这个教程写的JavaFX教程,不过我是创建的一个Maven项目。一开始是选择Gradle作为构建工具,但是一直出现“JavaFX 缺少必要组件”之类的错误,后来简单了解了一下,Maven在引入依赖后,会把相关的依赖都引入。下面是pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com</groupId>
  <artifactId>sample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>sample</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
	<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
	<dependency>
	    <groupId>org.openjfx</groupId>
	    <artifactId>javafx-controls</artifactId>
	    <version>11</version>
	</dependency>
    
	<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
	<dependency>
	    <groupId>org.openjfx</groupId>
	    <artifactId>javafx-fxml</artifactId>
	    <version>11</version>
	</dependency>

  </dependencies>
</project>

  但是在编写完一个简单的界面后,运行程序出现了下面的错误:
使用Eclipse编写JavaFX应用
看了一些博客,最终的解决办法是另外创建一个启动类,并在该类的main方法中启动程序。MainApp.java以及启动类代码如下:

MainApp.java

package com.sample;

import java.io.IOException;
import java.nio.file.Paths;

import com.sample.model.Person;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class MainApp extends Application{
	private Stage primaryStage;
	private BorderPane rootLayout;
	private ObservableList<Person> personData=FXCollections.observableArrayList();

	public MainApp() {
        personData.add(new Person("Hans", "Muster"));
        personData.add(new Person("Ruth", "Mueller"));
        personData.add(new Person("Heinz", "Kurz"));
        personData.add(new Person("Cornelia", "Meier"));
        personData.add(new Person("Werner", "Meyer"));
        personData.add(new Person("Lydia", "Kunz"));
        personData.add(new Person("Anna", "Best"));
        personData.add(new Person("Stefan", "Meier"));
        personData.add(new Person("Martin", "Mueller"));
	}

	@Override
	public void start(Stage primaryStage) throws Exception {
		this.primaryStage=primaryStage;
		this.primaryStage.setTitle("JFX App");
		this.primaryStage.getIcons().add(new Image("file:resources/image/book.png"));
		try {
			initLayout();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void initLayout() throws IOException {
		FXMLLoader loader=new FXMLLoader();
		loader.setLocation(MainApp.class.getResource("root_view.fxml"));
		rootLayout=(BorderPane)loader.load();
		Scene scene=new Scene(rootLayout);
		RootViewController controller=loader.getController();
		controller.setMainApp(this);
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	
	public Stage getPrimaryStage() {
		return primaryStage;
	}

	public void setPrimaryStage(Stage primaryStage) {
		this.primaryStage = primaryStage;
	}

	public ObservableList<Person> getPersonData() {
		return personData;
	}

	public void setPersonData(ObservableList<Person> personData) {
		this.personData = personData;
	}
	
	public boolean showPersonEditDialog(Person person) {
		try {
			FXMLLoader loader=new FXMLLoader();
			loader.setLocation(MainApp.class.getResource("person_edit.fxml"));
			BorderPane borderPane=loader.load();
			// create dialog stage
			Stage dialogStage=new Stage();
			dialogStage.setTitle("Edit Person");
			dialogStage.initModality(Modality.WINDOW_MODAL);
			dialogStage.initOwner(primaryStage);
			Scene scene=new Scene(borderPane);
			dialogStage.setScene(scene);
			// set person into controller
			PersonEditDialogController personEditDialogController=loader.getController();
			personEditDialogController.setDialogStage(dialogStage);
			personEditDialogController.setPerson(person);
			
			dialogStage.showAndWait();
			return personEditDialogController.isOkClicked();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}
	

	public static void main(String[] args) {
		launch(args);
	}
}

Starter.java

package com.sample;

public class Starter {

	public static void main(String[] args) {
		MainApp.main(args);
	}

}

  整个项目的结构如下图:
使用Eclipse编写JavaFX应用
程序运行效果:
使用Eclipse编写JavaFX应用