Fxml是一种以Xml的格式表示JavaFx界面对象的问价,Fxml文件中的每一个元素可以映射到JavaFx中的一个类,每个Fxml的元素的属性或者其子元素都可以为该对应JavaFxml类的属性。Fxm的应用到JavaFx上可以作为界面使用,其好处也是显而易见的,将界面从代码中分离出来。使整个程序的逻辑结构更加清晰。并且Orcale还开发出了SceneBuild 直接在界面上左图形拖拽来拼接界面,让界面的开发显得更加直观。现在我们用JavaFx的main+fxml+controller的结构来开发一个简单的记事本结构程序。
· 首先,我们先用SceneBuild将大致的界面画出来,如下图所示:额,应该先创建Fxml的文件的: 在eclipse中右键 -- new - - other -- JavaFx --JavaFx Fxml 写好文件名之后沿着一路点击next就可以了。
如图中所示:SceneBuild里的左上侧Library用来对组件的搜索,左下侧的hierarchy里可以看到界面中的组件的结构,右侧是对其大小,属性,连接的事件等的设定,这里没有将图片剪接出来。
然后在Main类里写好连接Fxml的方法,这里的一个要点就是和Fxml的连接。注意连接方法和假如fxml的文件和main文件不在同一个文件夹的情况,代码如下所示。
Parent root = FXMLLoader.load(getClass().getResource("NoteBook.fxml")); //与Fxml连接的方式:注:此时是在同一个包里的
Scene scene = new Scene(root,550,600);
primaryStage.setTitle("笔记本");
primaryStage.setScene(scene);
primaryStage.show();
然后是controlller的写法:用@fxml作为注释来连上fxml的文件:
public class Control { @FXML private AnchorPane layoutpane; @FXML private TextArea filecontent; private File files; @FXML private void onmenuOpen(ActionEvent event) throws Exception{ FileChooser filechos = new FileChooser(); files = filechos.showOpenDialog(layoutpane.getScene().getWindow()); if (files !=null){ filecontent.setText(readFiles(files)); } } @FXML private void onmenuSave(ActionEvent event) throws Exception{ if(files==null){ FileChooser filechos = new FileChooser(); files = filechos.showSaveDialog(layoutpane.getScene().getWindow()); } writeFiles(files, filecontent.getText()); } @FXML private void onmenuclose(ActionEvent event){ System.exit(0); } @FXML private void onmenudelet(ActionEvent event){ filecontent.setText(""); } @FXML private void OonmenuAbout(ActionEvent event){ JOptionPane.showMessageDialog(null, "JavaFX记事本是一款使用JavaFX开发的记事本。" ,"关于", JOptionPane.PLAIN_MESSAGE); } @FXML private void onContextSelectAll(ActionEvent event) { filecontent.selectAll(); }
由于写的是关于记事本的程序,所以主要用到的IO流和文件选择器之类的组件和方法。以后会对JavaFx的各个组件进行探究,到时后主要就是转载了,人家是官方毕竟,写的肯定要比我自己理解的好的多。还有,这里还有一个关于文本换行的写法,我感觉这里也是一个问题,稍微不注意,就会掉进大坑里
然后是将controller和Fxml连接起来。controller里装的都是Fxml里所需要的的各式各样的触发事件,没有controlller,Fxml只是一个界面而已。在scenebuild里的左下侧controller里找到controller class,将对应的controller选上,然后在scenebuild的选项里就可以看到有@fxml注释标记的属性,方法,事件了。将对应的fx:id 和onAction一 一选上之后保存,然后刷新Fxml(这里也是一个小点,更改完Fxml如果不刷新的话,还是会照着原来的fxml编译运行)。完成之后运行main方法,其对应的结果如下图所示: