提示:本博客为JavaFX根据UDP通信协议做简易发送消息和反馈界面,编写依据了通信接口协议,具体协议内容不便展示。


文章目录

  • 前言
  • 一、UDP/TCP是什么?
  • 二、JavaFX编写优势
  • 1.引入库
  • 2.大体构架
  • 三、每个区域知识点讲解
  • 3.1 Label (对应图中①)
  • 3.2 SplitMenuButton(对应图中③)
  • 3.3 TextField(对应图中④)
  • 3.4 TextArea(对应图中⑤)
  • 3.5 Button(对应图中⑥发送按钮)
  • 3.6 退出程序(对应图中⑥退出按钮)
  • 3.7 TableView(对应图中⑦)
  • 总结



前言

工作中有时候会根据通信协议写一些通信接口,常用的有UDP与TCP俩种通信方式,均是通过局域网配置IP与port进行端口绑定。

一般会有公有协议与私有协议,公有的比较规范受到行业大部分厂家通信规定,私有的是与部分厂家少量通信活动编制的协议。

具体编写的界面如下图所示:

javafx创建窗口使用fxml中controller何时创建 javafx做界面_udp


一、UDP/TCP是什么?

我们常见的通信协议是TCP,本次桌面程序开发适用的协议是UDP,两者之间的不同就像群聊与私聊,UDP为群聊,在微信群中别人给你发消息,你要是在群里一定可以看到消息,不在群里或者下线就会接收不到消息,TCP就像私聊,你两都在线聊天的情况下才会相互发消息收消息。
也可以把这两个通信方式比喻为打电话和发短信,只不过短信没有时效性,发短信当时没看见以后也会看见,UDP通信不一样,当时没收到消息那条消息永远也收不到了,TCP则是打电话,只有在两个人接通的情况下进行消息传递。

二、JavaFX编写优势

JavaFX 是一个开源的下一代客户端应用平台,适用于基于Java构建的桌面、移动端和嵌入式系统。 它是许多个人和公司的共同努力的成果,目的是为开发丰富的客户端应用提供一个现代、高效、功能齐全的工具包。
Java对字节的处理还是挺方便的,可以精准到每个byte填充什么数据,比如说将年月日填充到7byte:

Date date = new Date(i);
 Long nowtime = Long.valueOf(df.format(date));
 String nian1 = df.format(date).substring(0, 2);
 String nian2 = df.format(date).substring(2, 4);
 String yue = df.format(date).substring(4, 6);
 String ri = df.format(date).substring(6, 8);
 String shi = df.format(date).substring(8, 10);
 String fen = df.format(date).substring(10, 12);
 String miao = df.format(date).substring(12, 14);
           ......   省略创建byte  
 b_data[p++] = (byte) Integer.parseInt(nian1);// 年1默认
 b_data[p++] = (byte) Integer.parseInt(nian2);// 年2
 b_data[p++] = (byte) Integer.parseInt(yue);// 月
 b_data[p++] = (byte) Integer.parseInt(ri);// 日
 b_data[p++] = (byte) Integer.parseInt(shi);// 时
 b_data[p++] = (byte) Integer.parseInt(fen);// 分
 b_data[p++] = (byte) Integer.parseInt(miao);// 秒

Java与JavaFX结合可以方便快捷的写出一个简单易用的界面,审美好点的同学也可以写出更漂亮的界面以供使用。

1.引入库

代码如下(示例):

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;

2.大体构架

界面大体模块分布如下图所示:

javafx创建窗口使用fxml中controller何时创建 javafx做界面_java_02

一共8个区域,分别采用HBOX与VBOX布局,这里的知识点可以参考之前的博文:
链接: JavaFX - HBOX、VBOX(水平、垂直布局)


三、每个区域知识点讲解

3.1 Label (对应图中①)

三个Lable放在了一个VBOX里呈现出竖列,Lable使用方法之前写过博文粘贴过代码:
链接: JavaFX -TextField、Lable、PasswordFleld Lable就是标签控件,主要用于向用户描述其他组件的用途,不可编辑,setFont为设置字体大小,setMaxWidth设置最大宽度。

Label l_trainID = new Label("列车 ID:");
        l_trainID.setFont(new Font(18));//字体大小
        Label l_trainID2 = new Label("11001");
        l_trainID2.setMaxWidth(180.0);//最大宽度

3.2 SplitMenuButton(对应图中③)

图中的③是一个下拉选择组件,使用效果如下动图

javafx创建窗口使用fxml中controller何时创建 javafx做界面_udp_03


SplitMenuButton使用之前写过代码粘贴在博文里,感兴趣的小伙伴可以去复制拿去学习。

链接: 下拉选择菜单SplitMenuButton 下面的代码段为基础展示,绑定事件为选择之后显示出用户选择项

final MenuItem item1 = new MenuItem("调度命令");
        final MenuItem item2 = new MenuItem("路票");
        final MenuItem item3 = new MenuItem("绿色许可证");
        final MenuItem item4 = new MenuItem("红色许可证");
        final MenuItem item5 = new MenuItem("出站调车跟踪通知书");
        final MenuItem item6 = new MenuItem("列车进路预告");
        final MenuItem item7 = new MenuItem("调车作业通知单");
        final MenuItem item8 = new MenuItem("调车请求确认");
        final MenuItem item9 = new MenuItem("其他信息");
        final MenuItem item0 = new MenuItem("出入库检测");

//下拉菜单
        final SplitMenuButton smb = new SplitMenuButton();
        smb.getItems().addAll(item1, item2, item3, item4, item5, item6, item7, item8, item9, item0);
        smb.setText("点击选择信息类型");
        .....
        smb.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                smb.show();
            }
        });

3.3 TextField(对应图中④)

TextField的意思为“文本框;文本域;文本字段;文本区;文字字段”,它是java 桌面应用中的一个文本框组件,能够实现文本的输入和输出,textfield有许多功能方法可以使用,丰富组件。
不同于Label 是用户可以对此文本框进行编辑操作
之前写过有关TextField的博文大家可以去看看复制代码玩玩
链接: JavaFX -TextField、Lable、PasswordFleld .getText();为常用的获取用户文本输入方法。

final TextField TrainTxt = new TextField();
CCH = TrainTxt.getText();

System.out.println(CCH);
 //计算补0
int cchcd = 0;
cchcd = CCH.length()-1;
int buwei = 6 - cchcd;
//
byte c[] = null;
try {
       c = CCH.getBytes("UTF-8");
       System.out.println(Arrays.toString(c));

} catch (UnsupportedEncodingException e1) {
       // TODO Auto-generated catch block
        e1.printStackTrace();
}

3.4 TextArea(对应图中⑤)

TextArea多行文本输入框; 文本框; 多行文本框; 元素; 文本域;与TextField不同的是本组件可以输入多行文本,相当于是大号的TextField,TextField只有一行可写;TextArea是一个区域,可以有很多行;TextArea的方法比TextField多。从图中就可看出差距(④⑤对比)。
之前写过有关TextArea的博文大家可以去看看复制代码玩玩
链接: Java FX - TextArea 同样,.getText();方法为TextArea获取用户输入文本的方法,
ddmlmsg.getBytes(“UTF-8”)可将编码格式改为UTF-8,编码格式为发送信息双方约定好的编码,同样可改的编码格式很多,比如熟知的GB2313等。

final TextArea area = new TextArea();
        area.setMaxHeight(885);
        area.setMaxWidth(300);
        area.setPrefSize(350, 350);
        area.setEditable(true);
        area.setPromptText("请输消息正文");
        area.setWrapText(true);
        area.setPrefColumnCount(100);
        area.setPrefRowCount(100);
......
       ddmlmsg = area.getText();
......       
       System.out.println(ddmlmsg);
                byte b[] = null;
                try {
                    b = ddmlmsg.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

3.5 Button(对应图中⑥发送按钮)

发送按钮涉及到byte字符拼接,UDP通讯,我们之后单独拿出一篇博文单独介绍,后续补充

3.6 退出程序(对应图中⑥退出按钮)

退出按钮即为退出程序,primaryStage关闭即可(可在添加一步dialog提示是否确认退出)。

Button out = new Button("退出");
        out.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                primaryStage.close();
            }
        });

3.7 TableView(对应图中⑦)

TableView涉及到数据绑定,getset方法,双击事件等需要大量篇幅介绍,我们之后单独拿出一篇博文单独介绍,后续补充

总结

以上就是本简单程序所需要的一些知识点,很多知识点在之前的博文中已经体现,如有问题欢迎留言讨论,欢迎指导不足之处