JAVA Swing开发单机版项目
一、序
最近公司做的项目里出现了一个新的需求,项目大部分是为金融业定制开发的数据集成平台,包括数据的采集,处理,使用。
数据的采集方式不固定,有机构化数据,有非结构话数据,还有附件等其它文件形式。
对于采集端,大部分要求具备硬件服务器架设能力,这时就出现了一个问题,有些采集端是不具备硬件服务器架设能力的,或者主观上不愿意架设,
要求公司拿出一套可以不假设服务器,而是和中心服务器交互。
功能精简为:只保留数据采集,数据结果由中心服务器来提供,客户端安装模式。
二、解决:
我们是JAVA,要开发客户端,那就是AWT、SWING,业内也一直都说是C#更适合开发。
老板一句话,两周之内要产品,没办法,还是用熟悉的SWING吧。遇到了很多问题,中间很坎坷,在这里记录一下:
(1)页面的设计嵌套时,要整个包裹好再放入另一个容器里,这样就可以保证样式
(2)SWING时间控件的选择很少,第三方的时间控件又很难满足具体项目的定制需求
(3)表格的分页,表格单元格显示复选框的感觉很别扭
三、重点:
(1)框架居中:
//第一种居中方式(为空时默认居中) this.setLocationRelativeTo(null);//第二种居中方式(获取屏幕来居中) int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight(); this.setBounds((int)(width/2-500/2), (int)(height/2-350/2), 500, 350); //this.setUndecorated(true); this.setResizable(false);(2)分割框的分割比重
//第一种设置方式,不具有强制性,有可能设置失败 panel_split.setResizeWeight(0.6);//第二种设置方式,可以指定分割框所占的比重 panel_split.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { panel_split.setDividerLocation(1.0 / 4.0); } }); panel_split.setOrientation(JSplitPane.VERTICAL_SPLIT);(3)表格插入图片的时候显示字符串
//其中6、7均为格式需要转换为图片的列位置 table = new JTable(model){@SuppressWarnings({ "unchecked", "rawtypes" })public Class getColumnClass(int column) {if (column==6 && model.getDataVector().size()>0) {return getValueAt(0, 6).getClass();} else if(column==7 && model.getDataVector().size()>0) {return getValueAt(0, 7).getClass();} else {return getValueAt(0, 0).getClass();}} };//图片数据列的插入 row.addElement(new ImageIcon(this.getClass().getClassLoader().getResource("reload.png")));//普通字串数据列的插入 row.add(data.get("FILE_ID")==null?new String(""):data.get("FILE_ID"));(4)分页对象
//分页对象 package com.dis.view;import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel;@SuppressWarnings("serial") public abstract class SubPageBar extends JPanel implements ItemListener, ActionListener {private int allCount, fromRec, endRec, pageSize, pageIndex, pageCount;private JLabel allCountLab, curCountLab, pageIndexLab;@SuppressWarnings("rawtypes")private JComboBox eachCom;// 首页private JButton firstPageButton;// 前一页private JButton latePageButton;// 下一页private JButton nextPageButton;// 末页private JButton lastPageButton;public SubPageBar(int recNums) {this.allCount = recNums;initUI();updateData();}@SuppressWarnings({ "unchecked", "rawtypes" })private void initUI() {// comboBoxeachCom = new JComboBox(new String[] { "10", "20", "50" });// labelcurCountLab = new JLabel();allCountLab = new JLabel();pageIndexLab = new JLabel();// buttonfirstPageButton = new JButton("首页");latePageButton = new JButton("上一页");nextPageButton = new JButton("下一页");lastPageButton = new JButton("末页");// listenereachCom.addItemListener(this);firstPageButton.addActionListener(this);nextPageButton.addActionListener(this);latePageButton.addActionListener(this);lastPageButton.addActionListener(this);this.setLayout(new FlowLayout(FlowLayout.RIGHT));this.add(curCountLab);this.add(allCountLab);this.add(new JLabel("每页"));this.add(eachCom);this.add(new JLabel("条"));this.add(firstPageButton);this.add(latePageButton);this.add(pageIndexLab);this.add(nextPageButton);this.add(lastPageButton);}/*** @Description: (更新分页栏的值)*/private void updateData() {// 必须知道的参数值:allCount pageIndex pageSizepageSize = Integer.valueOf(eachCom.getSelectedItem().toString());fromRec = pageIndex * pageSize + 1;if (0 == allCount) {fromRec = 0;}endRec = (pageIndex + 1) * pageSize;if (endRec > allCount) {endRec = allCount;}pageSize = (0 == pageSize) ? 1 : pageSize;pageCount = allCount / pageSize - ((0 == allCount % pageSize && 0 != allCount) ? 1 : 0); // curCountLab.setText("第 " + fromRec + "~" + endRec + " 条");allCountLab.setText("【共有 " + allCount + " 条】 ");pageIndexLab.setText(" 【第 " + (pageIndex) + "/" + (pageCount + 1) + " 页】 ");firstPageButton.setEnabled(pageIndex > 0);latePageButton.setEnabled(pageCount > 0 && pageIndex > 0);nextPageButton.setEnabled(pageIndex < pageCount);lastPageButton.setEnabled(pageCount > 0 && pageIndex < pageCount);}/*** @Description: 有新数据载入时,需要重载*/public void fresh(int recNums) {this.allCount = recNums;updateData();}@Overridepublic void itemStateChanged(ItemEvent e) {// 这边之所以要加上这个判断,是因为“选中”和“取消选中”都会触发ItemEvent.if (e.getStateChange() == ItemEvent.SELECTED) {pageIndex = 0;pageSize = Integer.valueOf(eachCom.getSelectedItem().toString());updateData();onPageSizeChange(pageSize);}}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource() == firstPageButton) {pageIndex = 1;onClickPreButton(pageIndex);} else if (e.getSource() == latePageButton) {pageIndex--;onClickPreButton(pageIndex);} else if (e.getSource() == nextPageButton) {pageIndex++;onClickNextButton(pageIndex);} else if (e.getSource() == lastPageButton) {pageIndex = pageCount;onClickNextButton(pageIndex);}updateData();}public int getPageIndex() {return (pageIndex>0) ? pageIndex : 1;}public void updatePageIndex(int pageIndex) {this.pageIndex = pageIndex;updateData();}public int getPageSize() {return pageSize;}public abstract void onPageSizeChange(int newPageSize);public abstract void onClickPreButton(int pageIndex);public abstract void onClickNextButton(int pageIndex);}//分页对象集成 table_col_name = new Vector<>();table_col_name.add("编号");table_col_name.add("文件名");table_col_name.add("机构名");table_col_name.add("流程名");table_col_name.add("当前状态");table_col_name.add("变更时间");table_col_name.add("操作");table_col_name.add("重置");Vector<Vector<Object>> rowData = new Vector<Vector<Object>>();DefaultTableModel model = new DefaultTableModel(rowData, table_col_name);table = new JTable(model){@SuppressWarnings({ "unchecked", "rawtypes" })public Class getColumnClass(int column) {if (column==6 && model.getDataVector().size()>0) {return getValueAt(0, 6).getClass();} else if(column==7 && model.getDataVector().size()>0) {return getValueAt(0, 7).getClass();} else {return getValueAt(0, 0).getClass();}}};table.getTableHeader().setReorderingAllowed(false);// 限制整列拖动table.setEnabled(false);table.addMouseListener(tableListener);table_bar = new SubPageBar(0) {@Overridepublic void onPageSizeChange(int newPageSize) {initTable();}@Overridepublic void onClickPreButton(int pageIndex) {this.updatePageIndex(pageIndex--);initTable();}@Overridepublic void onClickNextButton(int pageIndex) {this.updatePageIndex(pageIndex++);initTable();}};JPanel panel_table = new JPanel(new BorderLayout());JScrollPane scrollPanel_table = new JScrollPane();scrollPanel_table.setBorder(border);scrollPanel_table.setViewportView(table);panel_table.add(scrollPanel_table, BorderLayout.CENTER);panel_table.add(table_bar, BorderLayout.SOUTH);scrollPanel_bottom.setViewportView(panel_table);//表格数据加载 //初始化表格@SuppressWarnings("unchecked")public void initTable() {HashMap<String,String> params = this.getParams();params.put("page", table_bar.getPageIndex()+"");params.put("rows", table_bar.getPageSize()+"");if (params.get("cycleType")=="-1") {params.remove("cycleType");}try {//请求数据 // String resultStr = HttpRequest.sendGetRequest(PropertyUtil.readKeyValue(PropertyUtil.CONFIG_FILE_PATH, PropertyUtil.API_GETALLFILE), params,"UTF-8");String resultStr = HttpRequest.sendGetRequest(Sysconfig.getSysInstance().getProperty(PropertyUtil.API_GETALLFILE), params,"UTF-8");Page resultPage = GsonUtil.GsonToBean(resultStr, Page.class);//解析数据int totalCount = resultPage.getTotal();List<Map<String,String>> fileList = (List<Map<String, String>>) resultPage.getRows();//渲染表格 table_bar.fresh(totalCount);DefaultTableModel model = (DefaultTableModel) table.getModel();model.getDataVector().clear();Vector<Vector<Object>> vData = model.getDataVector();if(null != fileList && fileList.size() > 0 && totalCount > 0) {Page page = null;page = new Page(totalCount);page.setPageSize(table_bar.getPageSize());page.setPageNow(pageNow);for (Map<String, String> data : fileList) {Vector<Object> row = new Vector<Object>();row.add(data.get("FILE_ID")==null?new String(""):data.get("FILE_ID"));row.add(data.get("FILE_NAME")==null?new String(""):data.get("FILE_NAME"));row.add(data.get("BANK_NAME")==null?new String(""):data.get("BANK_NAME"));row.add(data.get("PROCESS_NAME")==null?new String(""):data.get("PROCESS_NAME"));row.add(data.get("NODE_DESC")==null?new String(""):data.get("NODE_DESC"));row.add(data.get("UPDATE_TIME")==null?new String(""): this.parseDate(data.get("UPDATE_TIME")));row.addElement(new ImageIcon(this.getClass().getClassLoader().getResource("look.png")));row.addElement(new ImageIcon(this.getClass().getClassLoader().getResource("reload.png")));row.add(data.get("F_PNODE_STATE")==null?new String(""):data.get("F_PNODE_STATE"));vData.add(row);}}table.getColumnModel().getColumn(7).setCellEditor(new DefaultCellEditor(new JCheckBox()));model.fireTableCellUpdated(0, 7);model.fireTableDataChanged();} catch (Exception e) {JOptionPane.showMessageDialog(this, "服务地址解析错误!");e.printStackTrace();log.error("服务地址解析错误!");}}
转载于:https://www.cnblogs.com/hackxiyu/p/9211893.html
JAVA Swing开发单机版项目相关推荐
- Java高级开发0-1项目实战-青鸟商城-Day03
作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...
- java awt 简单计算器,JAVA Swing 开发简易计算器(上)
开发一个简易的计算器我们主要分为两大部分:图形界面设计与具体功能实现.这篇文章讲图形界面设计,下篇讲具体功能实现. 代码下载:https://github.com/taifus/Java_Calcul ...
- kotlin与java混合开发_使用kotlin和Java混合开发Android项目爬坑记录
使用kotlin和Java混合开发Android项目爬坑记录 不定期将开发过程中遇到的问题添加在此处,加深记忆. 主要内容包括但不限于java与kotlin语言的一些区别,以及在使用android-s ...
- java swing开发窗体程序开发(三)事件(Mouse,Foucs,Key,Window)
接着刚刚的事件讲 补充一点:事件的触发前提,添加了这个监听器的组件必须是处于激活状态的才可行 (一)MouseEvent事件 该事件的触发是由鼠标的动作引起的,引起的情况可以是下面5种,按下鼠标,释放 ...
- Java Swing版单机版三国杀
原文:Java Swing版单机版三国杀 源代码下载地址:http://www.zuidaima.com/share/1584513538509824.htm
- java swing开发窗体程序开发(四)MVC结构
MVC是一种设计结构(非设计模式,非设计原则) M:Model 模型层:即用于存储数据的对象 V:View 视图层:即用于为模型提供数据显示的对象 C:Controller 控制器层:即处理用户的业务 ...
- java swing开发窗体程序开发(一)GUI编程
Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代 ...
- 深度讲解Java多线程开发—电子表项目实现
目录 1.前端界面的设计 2.添加控件的事件监听 3.通过主线程对时间实时显示 4.启用线程实现对时间的修改 5.线程同步实现秒表功能 6.运行并进行调试 Hello,大家好,我是灰小猿! 今天和大家 ...
- Java 后端开发实践 - 项目模板(16 步)
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
最新文章
- java检索字符串并提取_eclipse 项目中搜索资源(类方法,文件名,文件中的字符串)...
- Web环境从Apache转Nginx后页面报404错误
- 刷脸取件遭小学生破解,丰巢智能柜紧急下线相关功能
- 启动spark shell
- AttributeError: 'Request' object has no attribute 'is_xhr' 报错的解决办法
- 张凯院 矩阵论学习_有限群表示论(0): 前言
- 使用Java代码发送邮件
- Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)
- 如何用matlab计算不确定度,Matlab计算“间接测量物理量的不确定度”
- ubuntu恢复分区表——testdisk
- 利用CSS完成鼠标悬浮时中英文切换
- jQuery的文档处理
- 美国大学生数学建模-足球传递网络图
- python分苹果问题_蓝桥杯--算法提高--VIP--分苹果题目(差分数组)
- Jquery中AJAX参数详细列表
- 缘系天涯,一枕残梦千里殇岁月沉积着忧伤:伤感日志
- 微信jsapi支付获取code_微信JSAPI公众号支付在部分机型上出现appid参数错误的解决办法 - YangJunwei...
- 固高GTS控制卡功能介绍1:SmartHome回零功能
- java urlrewrite_Java版URL Rewrite
- Wrong 1st argument type. Found:List<java.lang.String>‘, required: ‘java.util.List<T>
热门文章
- 互联网日报 | 3月10日 星期三 | 快手电商与五菱汽车达成合作;华为推出“女性开发者计划”;小鹏汽车首次实现全年毛利转正...
- 【前端学习笔记】(三)(CSS基础、选择器、字体和文本样式)
- 少儿机器人编程与软件编程区别
- mysql varchar类型实例_Mysql实例MySQL数据类型varchar详解
- 自己觉得有用的帖子(AI 论文写作等 )
- day05-日常考试题
- CeFi、DeFi必有一战?不,更可能融合
- Python爬虫笔记——post请求、cookies及session
- oracle报表文件,Oracle ReportViewer以及如何查看Oracle报表
- Rhinoceros 7 for Mac(犀牛7 mac版)