一、序

  最近公司做的项目里出现了一个新的需求,项目大部分是为金融业定制开发的数据集成平台,包括数据的采集,处理,使用。

  数据的采集方式不固定,有机构化数据,有非结构话数据,还有附件等其它文件形式。

  对于采集端,大部分要求具备硬件服务器架设能力,这时就出现了一个问题,有些采集端是不具备硬件服务器架设能力的,或者主观上不愿意架设,

  要求公司拿出一套可以不假设服务器,而是和中心服务器交互。

  功能精简为:只保留数据采集,数据结果由中心服务器来提供,客户端安装模式。

二、解决:

  我们是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开发单机版项目相关推荐

  1. Java高级开发0-1项目实战-青鸟商城-Day03

    作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...

  2. java awt 简单计算器,JAVA Swing 开发简易计算器(上)

    开发一个简易的计算器我们主要分为两大部分:图形界面设计与具体功能实现.这篇文章讲图形界面设计,下篇讲具体功能实现. 代码下载:https://github.com/taifus/Java_Calcul ...

  3. kotlin与java混合开发_使用kotlin和Java混合开发Android项目爬坑记录

    使用kotlin和Java混合开发Android项目爬坑记录 不定期将开发过程中遇到的问题添加在此处,加深记忆. 主要内容包括但不限于java与kotlin语言的一些区别,以及在使用android-s ...

  4. java swing开发窗体程序开发(三)事件(Mouse,Foucs,Key,Window)

    接着刚刚的事件讲 补充一点:事件的触发前提,添加了这个监听器的组件必须是处于激活状态的才可行 (一)MouseEvent事件 该事件的触发是由鼠标的动作引起的,引起的情况可以是下面5种,按下鼠标,释放 ...

  5. Java Swing版单机版三国杀

    原文:Java Swing版单机版三国杀 源代码下载地址:http://www.zuidaima.com/share/1584513538509824.htm

  6. java swing开发窗体程序开发(四)MVC结构

    MVC是一种设计结构(非设计模式,非设计原则) M:Model 模型层:即用于存储数据的对象 V:View 视图层:即用于为模型提供数据显示的对象 C:Controller 控制器层:即处理用户的业务 ...

  7. java swing开发窗体程序开发(一)GUI编程

    Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代 ...

  8. 深度讲解Java多线程开发—电子表项目实现

    目录 1.前端界面的设计 2.添加控件的事件监听 3.通过主线程对时间实时显示 4.启用线程实现对时间的修改 5.线程同步实现秒表功能 6.运行并进行调试 Hello,大家好,我是灰小猿! 今天和大家 ...

  9. Java 后端开发实践 - 项目模板(16 步)

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

最新文章

  1. java检索字符串并提取_eclipse 项目中搜索资源(类方法,文件名,文件中的字符串)...
  2. Web环境从Apache转Nginx后页面报404错误
  3. 刷脸取件遭小学生破解,丰巢智能柜紧急下线相关功能
  4. 启动spark shell
  5. AttributeError: 'Request' object has no attribute 'is_xhr' 报错的解决办法
  6. 张凯院 矩阵论学习_有限群表示论(0): 前言
  7. 使用Java代码发送邮件
  8. Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)
  9. 如何用matlab计算不确定度,Matlab计算“间接测量物理量的不确定度”
  10. ubuntu恢复分区表——testdisk
  11. 利用CSS完成鼠标悬浮时中英文切换
  12. jQuery的文档处理
  13. 美国大学生数学建模-足球传递网络图
  14. python分苹果问题_蓝桥杯--算法提高--VIP--分苹果题目(差分数组)
  15. Jquery中AJAX参数详细列表
  16. 缘系天涯,一枕残梦千里殇岁月沉积着忧伤:伤感日志
  17. 微信jsapi支付获取code_微信JSAPI公众号支付在部分机型上出现appid参数错误的解决办法 - YangJunwei...
  18. 固高GTS控制卡功能介绍1:SmartHome回零功能
  19. java urlrewrite_Java版URL Rewrite
  20. Wrong 1st argument type. Found:List<java.lang.String>‘, required: ‘java.util.List<T>

热门文章

  1. 互联网日报 | 3月10日 星期三 | 快手电商与五菱汽车达成合作;华为推出“女性开发者计划”;小鹏汽车首次实现全年毛利转正...
  2. 【前端学习笔记】(三)(CSS基础、选择器、字体和文本样式)
  3. 少儿机器人编程与软件编程区别
  4. mysql varchar类型实例_Mysql实例MySQL数据类型varchar详解
  5. 自己觉得有用的帖子(AI 论文写作等 )
  6. day05-日常考试题
  7. CeFi、DeFi必有一战?不,更可能融合
  8. Python爬虫笔记——post请求、cookies及session
  9. oracle报表文件,Oracle ReportViewer以及如何查看Oracle报表
  10. Rhinoceros 7 for Mac(犀牛7 mac版)