java swing开发单机版项目_hackxiyu-编程思维

一、序

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

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

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

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

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

 

二、解决:

  我们是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() {
        // comboBox
        eachCom = new JComboBox(new String[] { "10", "20", "50" });
        // label
        curCountLab = new JLabel();
        allCountLab = new JLabel();
        pageIndexLab = new JLabel();
        // button
        firstPageButton = new JButton("首页");
        latePageButton = new JButton("上一页");
        nextPageButton = new JButton("下一页");
        lastPageButton = new JButton("末页");
        // listener
        eachCom.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 pageSize
        pageSize = 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();
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        // 这边之所以要加上这个判断,是因为“选中”和“取消选中”都会触发ItemEvent.
        if (e.getStateChange() == ItemEvent.SELECTED) {
            pageIndex = 0;
            pageSize = Integer.valueOf(eachCom.getSelectedItem().toString());
            updateData();
            onPageSizeChange(pageSize);
        }
    }

    @Override
    public 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) {
            @Override
            public void onPageSizeChange(int newPageSize) {
                initTable();
            }

            @Override
            public void onClickPreButton(int pageIndex) {
                this.updatePageIndex(pageIndex--);
                initTable();
            }

            @Override
            public 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("服务地址解析错误!");
        }
    }

 

 

 

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/hackxiyu/p/9211893.html

客户端软件gui开发技术漫谈:原生与跨平台解决方案分析_zhoulujun-编程思维

原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓。 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样式表来讲,美化Winform的界面以及自定义控件是需要耗费更多的时间的。 WPF 基于XML+C#+CSS的呈现方式让它

java求解迷宫问题:栈与回溯算法_琴水玉-编程思维

          摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识。       难度: 中级      迷宫问题是栈的典型应用,栈通常也与回溯算法连用。 回溯算法的基本描述是:   (1)  选择一个起始点;       (2)  如果已达目的地, 则跳转到 (4); 如果

程序设计是给出解决特定问题程序的过程_borter-编程思维

程序设计是给出解决特定问题程序的过程,是 软件构造活动中的重要组成部分。程序设计往往以某种 程序设计语言为工具,给出这种语言下的程序。 程序设计过程应当包括 分析、 设计、 编码、测试、排错等不同阶段。 专业的程序设计人员常被称为程序员。 1 package Com.SwingTest; 2 3 4 im

错误档案1:eclipse自动生成swing窗体代码报错 - 编程思维

前言大家好呀,我是 白墨,一个热爱学习与划水的矛盾体。昨天为了图方便,使用MyEclipse中的swing功能画界面,画完以后发现无法运行,查看源代码发现全报错,一脸懵比。我本着事前三思的原则(能不能不做,能不能交给别人做,能不能明天做 ),就拖到了今天来解决。今天在询问度娘与沙雕群友无果之后,就去咨询了讲师,老师告诉

java简单的用户登录界面+mysql - 编程思维

2022.01.08 更新1 概述一个简单的Swing登录界面,使用了简单的JDBC。如图:2 UI2.1 主界面主界面使用了31网格布局+三个JPanel,中间的JPanel使用了22网格布局:import java.awt.FlowLayout; import java.awt.Font; import java