提示:本博客为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进行端口绑定。
一般会有公有协议与私有协议,公有的比较规范受到行业大部分厂家通信规定,私有的是与部分厂家少量通信活动编制的协议。
具体编写的界面如下图所示:
一、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.大体构架
界面大体模块分布如下图所示:
一共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(对应图中③)
图中的③是一个下拉选择组件,使用效果如下动图
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方法,双击事件等需要大量篇幅介绍,我们之后单独拿出一篇博文单独介绍,后续补充
总结
以上就是本简单程序所需要的一些知识点,很多知识点在之前的博文中已经体现,如有问题欢迎留言讨论,欢迎指导不足之处