zoukankan      html  css  js  c++  java
  • javaFx(记事本)Demo

    首先我们从官方网站下载JavaFX Scene Builder。

      打开程序,可以看到以下画面:

       如图所示,左上方是JavaFX控件列表,左下方是UI层结构,中间是可视化设计区域,右边是控件属性。

       

       那么,我们就构建一个简单的记事本程序吧!

       首先使用JavaFX Scene Builder 创建以下界面。

       这就是一个简单的记事本的界面了。上面是一个MenuBar,中间是一个TextArea用来显示打开的文本内容。在

    TextArea上添加了一个ContextMenu,也就是所谓的右键菜单。

       这里要注意一点:fx:id是一个很重要的属性,在事件逻辑层要获取JavaFX Scene Builder编辑的XML中的控件,需要通过fx:id来获取。

      另外,还要在右边属性的events中指定事件的方法。

      如下图所示,Menu中的Open事件对应onMenuOpen方法。

     

      这样,一个简易记事本的界面就创建好了。我们在JavaFX Scene Builder中将它保存为study.xml。

      接着,我们在e(fx)clipse中,新建一个JavaFX Project。记住要在preference里设定JavaFX SDK的位置(类似Android开发)。

      创建一个类MyApp 继承于javafx.application.Application。

      

    1. import javafx.application.Application;  
    2. import javafx.fxml.FXMLLoader;  
    3. import javafx.scene.Parent;  
    4. import javafx.scene.Scene;  
    5. import javafx.stage.Stage;  
    6. import javafx.stage.StageStyle;  
    7.   
    8. public class MyApp extends Application {  
    9.   
    10.     public static void main(String[] args) {  
    11.         Application.launch(MyApp.class, args);  
    12.     }  
    13.       
    14.     @Override  
    15.     public void start(Stage stage) throws Exception {  
    16.         Parent root = FXMLLoader.load(getClass().getResource("study.fxml"));  
    17.   
    18.         Scene scene = new Scene(root, 600, 400);  
    19.         stage.initStyle(StageStyle.DECORATED);  
    20.         stage.setScene(scene);  
    21.         stage.setTitle("JavaFX记事本");  
    22.         stage.show();  
    23.     }  
    24.   
    25. }  

      

      如上图所示,我们使用JavaFX中提供的FXMLLoader来加载我们编辑好的JavaFX界面。study.fxml应该放在与MyApp类相同的目录,通过getClass().getResource()获取该类目录的资源。

      上面的MyApp类中也出现了几个JavaFX中的类,Parent, Scene, Stage。那么这几个类到底有什么用呢?

      

      Stage是JavaFX最顶层的容器,最原始的Stage(也就是start方法后的参数)是根据系统平台进行创建的(也是跨平台的重点)。当然,你也可以在程序其他地方创建Stage。

      Scene是包括控件等所有内容的容器,应用程序必须指定Scene的根节点。既可以像上面代码中初始化时传入根节点,也可以通过setRoot方法来设定根节点。

      Parent是所有包含子节点的节点的基类。它是一个继承于Node的抽象类。因此Loader里其实是用到了向上转型。

      由上面的解释,可以很容易的知道JavaFX中是用到的树形结构。

      另外,JavaFX使用很常见的反射机制将UI层和事件层完全分离了。查看上面的study.xml,你就可以看到根节点有一个fx:controller属性。这个属性就是指定事件处理的类。比如我们现在应用程序中处理事件的类为Test.java。那么就修改fx:controller = "org.wing.javafx.project01.Test" 前面的是包名。

      那么,下面来写我们的事件处理类吧。

    [java] 
    1. import java.io.File;  
    2.   
    3. import javax.swing.JOptionPane;  
    4.   
    5. import javafx.event.ActionEvent;  
    6. import javafx.fxml.FXML;  
    7. import javafx.scene.Scene;  
    8. import javafx.scene.control.TextArea;  
    9. import javafx.scene.layout.AnchorPane;  
    10. import javafx.stage.FileChooser;  
    11.   
    12. public class Test {  
    13.     @FXML  
    14.     private AnchorPane layoutPane;  
    15.     @FXML  
    16.     private TextArea  fileContent;  
    17.     private File result;  
    18.       
    19.     @FXML  
    20.     private void onMenuOpen(ActionEvent event) {  
    21.         FileChooser fileChooser = new FileChooser();  
    22.         result = fileChooser.showOpenDialog(layoutPane.getScene().getWindow());  
    23.         if (result != null) {  
    24.             fileContent.setText(FileTools.readFile(result));  
    25.         }  
    26.     }  
    27.       
    28.     @FXML  
    29.     private void onMenuSave(ActionEvent event) {  
    30.         if(result != null){  
    31.             FileTools.writeFile(result, fileContent.getText());  
    32.         }  
    33.     }  
    34.       
    35.     @FXML  
    36.     private void onMenuClose(ActionEvent event) {  
    37.         System.exit(0);  
    38.     }  
    39.       
    40.     @FXML  
    41.     private void onMenuDelete(ActionEvent event) {  
    42.         fileContent.replaceSelection("");  
    43.     }  
    44.       
    45.     @FXML  
    46.     private void onMenuAbout(ActionEvent event) {  
    47.         JOptionPane.showMessageDialog(null, "JavaFX记事本是一款使用JavaFX开发的记事本。" ,"关于",  JOptionPane.PLAIN_MESSAGE);  
    48.     }  
    49.       
    50.     @FXML  
    51.     private void onContextSelectAll(ActionEvent event) {  
    52.         fileContent.selectAll();  
    53.     }  
    54. }  

      看上面的代码,你会发现与JavaFX映射的变量和方法都有@FXML标注。而变量的名称需要对应study.xml中控件的fx:id属性。事件处理的方法同样也是对应xml中定义的事件名称。

      在MenuOpen事件中打开一个文件选择器,然后获取选择的文件,读取文本文件的内容,最后设置到TextArea中。至于FileTools,则是临时下的文本文件读取的类。

      在MenuSave事件中,将TextArea中的内容保存到刚打开的文件中。

      上面还调用了Swing中的JOptionPane的显示Message的方法。由此可见,在如今的JavaFX中可以很轻易的使用Java Api。

      另外,下面的是FileTools的代码,很简单的文本文件读写。

    [java] 
    1. import java.io.BufferedReader;  
    2. import java.io.BufferedWriter;  
    3. import java.io.File;  
    4. import java.io.FileReader;  
    5. import java.io.FileWriter;  
    6.   
    7. public class FileTools {  
    8.       
    9.     public static String readFile(File file) {  
    10.         StringBuilder resultStr = new StringBuilder();  
    11.         try {  
    12.             BufferedReader bReader = new BufferedReader(new FileReader(file));  
    13.             String line = bReader.readLine();  
    14.             while (line != null) {  
    15.                 resultStr.append(line);  
    16.                 line = bReader.readLine();  
    17.             }  
    18.             bReader.close();  
    19.         } catch (Exception e) {  
    20.             e.printStackTrace();  
    21.         }  
    22.         return resultStr.toString();  
    23.     }  
    24.   
    25.     public static void writeFile(File file, String str) {  
    26.         try {  
    27.           BufferedWriter bWriter = new BufferedWriter(new FileWriter(file));  
    28.           bWriter.write(str);  
    29.           bWriter.close();  
    30.         } catch (Exception e) {  
    31.             e.printStackTrace();  
    32.         }  
    33.     }  
    34. }  

      最后就可以运行JavaFX程序了。

  • 相关阅读:
    找不到"javax.servlet.annotation.WebServlet"解决方法
    Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议
    Fiddler抓包工具使用
    利用window.open如何绕过浏览器拦截机制
    暂时性死区TDZ理解与总结
    利用vue-meta管理头部标签
    async、await总结
    正则中1、2的理解,利用正则找出重复最多的字符
    Vue优化:常见会导致内存泄漏问题及优化
    vue自定义指令导致的内存泄漏问题解决
  • 原文地址:https://www.cnblogs.com/hailiangboke/p/7591092.html
Copyright © 2011-2022 走看看