
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐ JavaFX рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЬреИрд╕реА рдЪреАрдЬреЗрдВред рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд░реНрдмреА рдФрд░ рдорд╛рд╡реЗрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкрд░рд┐рдЪрдп
рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JavaFX рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрдХрд░реНрд╖рдХ рддрдХрдиреАрдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдПрд╕рдИ 7 рдЕрдкрдбреЗрдЯ 6 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдЬрд╛рд╡рд╛рдПрдлрдПрдХреНрд╕ рдУрд░реЗрдХрд▓ рдЬрд╛рд╡рд╛ рдПрд╕рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╡рд╕рдВрдд, рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдЖрдИрдУрд╕реА, рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди, рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛
рдЖрдЗрдП рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред
рдЖрд╡реЗрджрди рд╡рд░реНрдЧ:
package ru.todolist; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class TodoApplication extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("/fxml/main.fxml")); Scene scene = new Scene(root, 300, 275); primaryStage.setTitle("Todolist"); primaryStage.setScene(scene); primaryStage.show(); } }
рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TodoApplication class рд╣реИ, рдЬреЛ JavaFX рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред FXMLLoader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рджреГрд╢реНрдп рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рд▓реЛрдбрд░ рд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рднреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред
main.fxml:
<?xml version="1.0" encoding="UTF-8"?> <?import java.net.*?> <?import javafx.geometry.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <GridPane fx:controller="ru.todolist.controller.MainController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" styleClass="root"> <Text id="welcome-text" text="Hello world!" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/> </GridPane>
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ, рдЖрдк рдЖрдЧреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рд╡реЗрди рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдБ
рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП, рдЖрдк
рдЬрд╝реЗрди рдЬрд╛рд╡рд╛ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред JavaFX рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ JRE рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЗрдВрд╕реНрдЯреЙрд▓рд░ (MSI, EXE, DMG, RPM) рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <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>ru.todolist</groupId> <artifactId>application</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <properties> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.zenjava</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>2.0</version> <configuration> <mainClass>ru.todolist.TodoApplication</mainClass> </configuration> </plugin> </plugins> </build> </project>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд▓рдЧрдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ, рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
mvn com.zenjava:javafx-maven-plugin:2.0:fix-classpath
рдЗрд╕ рдкрд░ рд╡рд┐рд╡рд░рдг рдХреНрдпреЛрдВ рдкреНрд▓рдЧрдЗрди
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдбрд░реНрдмреА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
рдкреВрд░реНрдг рдкреНрд░рд╕рдиреНрдирддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреВрд░реНрдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХрдореА рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбрд░реНрдмреА рд╕реЗрд╡рд╛ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<?xml version="1.0" encoding="UTF-8"?> <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>ru.todolist</groupId> <artifactId>application</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <properties> <derby.version>10.10.1.1</derby.version> ... </properties> <dependencies> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbynet</artifactId> <version>${derby.version}</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbyclient</artifactId> <version>${derby.version}</version> </dependency> ... </dependencies> <build> ... </build> </project>
рд╣рдо TodoApplication рд╡рд░реНрдЧ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╢реБрд░реВ рдФрд░ рдмрдВрдж рдХрд░ рджреЗред
public class TodoApplication extends Application { private static Logger LOG = Logger.getLogger(TodoApplication.class); ... @Override public void init() { try { DbUtils.startDB(); } catch (Exception e) { LOG.error("Problem with start DB", e); } } @Override public void stop() { try { DbUtils.stopDB(); } catch (Exception e) { LOG.error("Problem with stop DB", e); } } }
DbUtils рд╡рд░реНрдЧ рд╣реА:
package ru.todolist.utils; import org.apache.derby.drda.NetworkServerControl; import org.apache.log4j.Logger; import java.net.InetAddress; public class DbUtils { private static Logger LOG = Logger.getLogger(DbUtils.class); private static NetworkServerControl server; public static void startDB() throws Exception { LOG.info("Start DB"); server = new NetworkServerControl(InetAddress.getByName("localhost"), 1527); server.start(null); } public static void stopDB() throws Exception { LOG.info("Stop DB"); server.shutdown(); } }
рд╡рд╕рдВрдд рдЬреЛрдбрд╝реЗрдВ
рдЕрдм рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп pom.xml рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
<?xml version="1.0" encoding="UTF-8"?> <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>ru.todolist</groupId> <artifactId>application</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <properties> ... <spring.version>3.2.4.RELEASE</spring.version> <hibernate.version>4.2.6.Final</hibernate.version> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> ... </dependencies> <build> ... </build> </project>
рд╣рдореЗрдВ рдЕрдкрдиреЗ рд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛:
package ru.todolist.utils; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.util.Callback; import org.apache.log4j.Logger; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import ru.todolist.config.AppConfig; import ru.todolist.controller.Controller; import java.io.IOException; import java.io.InputStream; public class SpringFXMLLoader { private static Logger LOG = Logger.getLogger(SpringFXMLLoader.class); private static final ApplicationContext APPLICATION_CONTEXT = new AnnotationConfigApplicationContext(AppConfig.class); public static Controller load(String url) { InputStream fxmlStream = null; try { fxmlStream = SpringFXMLLoader.class.getResourceAsStream(url); FXMLLoader loader = new FXMLLoader(); loader.setControllerFactory(new Callback<Class<?>, Object>() { @Override public Object call(Class<?> aClass) { return APPLICATION_CONTEXT.getBean(aClass); } }); Node view = (Node) loader.load(fxmlStream); Controller controller = loader.getController(); controller.setView(view); return controller; } catch (IOException e) { LOG.error("Can't load resource", e); throw new RuntimeException(e); } finally { if (fxmlStream != null) { try { fxmlStream.close(); } catch (IOException e) { LOG.error("Can't close stream", e); } } } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо URL рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рджреГрд╢реНрдп рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
AppConfig.java рдЙрджрд╛рд╣рд░рдг package ru.todolist.config; import org.hibernate.ejb.HibernatePersistence; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; @Configuration @ComponentScan("ru.todolist") public class AppConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.apache.derby.jdbc.ClientDriver"); dataSource.setUrl("jdbc:derby://localhost:1527/todo;create=true");
рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
package ru.todolist.controller; import javafx.scene.Node; public interface Controller { Node getView(); void setView (Node view); }
рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдореЗрдВ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ AbstractController.java:
package ru.todolist.controller; import javafx.scene.Node; public abstract class AbstractController implements Controller { private Node view; public Node getView() { return view; } public void setView (Node view){ this.view = view; } }
рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢, рд╣рдо рдЯреЛрдбреЛрдПрдкреНрд▓рд┐рд╕рд┐рдПрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ рдорд╛рдирдХ рд▓реЛрдбрд░ рдХреЗ рдмрдЬрд╛рдп SprinFXMLLoader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
public class TodoApplication extends Application { ... @Override public void start(Stage primaryStage) throws Exception { MainController controller = (MainController) SpringFXMLLoader.load("/fxml/main.fxml"); Scene scene = new Scene((Parent) controller.getView(), 300, 275); primaryStage.setTitle("Todolist"); primaryStage.setScene(scene); primaryStage.show(); } ... }
рдкрд░рд┐рдгрд╛рдо
рдХреЛрдб рдмрд╣реБрдд рд╡рд┐рдХреГрдд рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдХрд╛рдлреА рд╕рд░рд▓ рдирд┐рдХрд▓рд╛ред рдирддреАрдЬрддрди, рд╣рдо JavaFX рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдЪрд┐рдд рддрдХрдиреАрдХ рд╕реНрдЯреИрдХ (рдЬрд╛рд╡рд╛ рдИрдИ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреБрдЗрд╕рд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдзрди