package com.vci.client.ui.swing.components.table; /** * *

Title:

*

Description:

*

Copyright: Copyright (c) 2012

*

Company: VCI

* @author xchao * @time 2012-5-10 * @version 1.0 */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.text.MessageFormat; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.regex.Pattern; import javax.swing.ImageIcon; import javax.swing.JProgressBar; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.EventListenerList; import com.vci.client.ui.swing.VCISwingUtil; import com.vci.client.ui.swing.components.VCIJButton; import com.vci.client.ui.swing.components.VCIJComboBox; import com.vci.client.ui.swing.components.VCIJLabel; import com.vci.client.ui.swing.components.VCIJOptionPane; import com.vci.client.ui.swing.components.VCIJPanel; import com.vci.client.ui.swing.components.VCIJScrollPane; import com.vci.client.ui.swing.components.VCIJTable; import com.vci.client.ui.swing.components.VCIJTextField; import com.vci.client.ui.swing.components.table.export.VCIJTablePanelExportFilterDialog; import com.vci.client.ui.swing.components.table.setting.ColumnSettingDialog; public class VCIJTablePanel extends VCIJPanel { /** * */ private static final long serialVersionUID = 3819801333985740641L; protected Component parentComponent = null; public void setParentComponent(Component parentComponent){ this.parentComponent = parentComponent; } /************************ 表格定制相关的 *********************************/ private VCIJTableSorter sorter = null; private int headerHeight = VCISwingUtil.JTABLE_HEADER_HEIGHT; private int rowHeight = VCISwingUtil.JTABLE_HEADER_HEIGHT; private boolean showCheckbox = true; // 是否显示CheckBox private boolean showRowNumber = true; // 是否显示序号 private boolean showPaging = true; // 是否显示翻页按钮,不显示翻页按钮时,一次查询最大量()的数据 private boolean showExport = true; // 是否显示导出按钮 private boolean showColumnSetting = true;// 是否显示列设置按钮 private boolean enableSorter = true; // 是否启用排序 private boolean enableMouseClickEffect = true; // 是否启用在表格单元格上单击时,自动选中CheckBox效果 private boolean enableMouseMoveEffect = true; // 是否启用鼠标在单元格上移动时,当前行高亮显示的效果 /** * 是否启用 鼠标停留在数据行上时,行颜色自动高亮 */ private boolean enableRowColorChangeInMouseHover = true; /** * 是否启用鼠标按下拖动(框选)时,执行将数据行选中 */ private boolean enbleMouseDraggedChecked = false; protected IVCIJTableBaseCheckManager tbChkManager = null; private boolean isSingleCheckManager = false; private Integer columnDefaultWidth = 100; private Integer columnDefaultWidthMax = 2500; private HashMap columnWidthMaps = new HashMap(); private int pageButtonFlowAlign = FlowLayout.LEFT; private int customButtonFlowAlign = FlowLayout.LEFT; private boolean customButtonAutoScroll = true; private int[] pageSizeList = null; private VCIJTableModel tableModel = null; private VCIJTable table = null; private VCIJTableDataProvider dataProvider = null; // 列是否可以移动顺序,默认为false,不可移动顺序 private boolean reorderingAllowed = false; // 列是否可以拖动宽度,默认true,可以拖动 private boolean resizingAllowed = true; // 是否显示网络线,默认true,显示 private boolean showGrid = true; // 是否启用列选择,默认为true,可以选择列(不是一整行) private boolean columnSelectionAllowed = true; // Table列自动调整大小模式 private int autoResizeMode = JTable.AUTO_RESIZE_OFF; // 行选择模式,默认支持多行选择 private int selectionMode = ListSelectionModel.MULTIPLE_INTERVAL_SELECTION;//ListSelectionModel.MULTIPLE_INTERVAL_SELECTION; // 可编辑列的索引 private List ediableColumnList = new LinkedList(); private boolean cellEditable = false; // 加载数据时,是否显示进度条 private boolean showProgressBar = true; // 是否是最后点击行才被选中,同时清空当前已经选中的其它数据模式是否生效 private boolean lastClickRowToChecked = true; /************************ 翻页相关的 *********************************/ private VCIJComboBox cbxPageSize = new VCIJComboBox(); private VCIJButton btnFirst = this.createNewButton("tablepage_first.png", "首页"); private VCIJButton btnPrev = this.createNewButton("tablepage_pre.png", "上一页"); private VCIJButton btnNext = this.createNewButton("tablepage_next.png", "下一页"); private VCIJButton btnLast = this.createNewButton("tablepage_last.png", "尾页"); private VCIJButton btnReload = this.createNewButton("tablepage_refresh.png", "刷新"); private VCIJTextField txtPageIndex = new VCIJTextField("1", 5); private VCIJButton btnGoPage = this.createNewButton("tablepage_go.png", "跳转到指定页"); private final String PAGE_INFO_FORMAT = "共{0}条,共{1}页,第{2}页"; private VCIJLabel lblPageInfo = new VCIJLabel(PAGE_INFO_FORMAT); private int total = 0; private int pageCount = 0; private int pageIndex = 1; private int pageSize = 50; private VCIJButton btnExport = this.createNewButton("xls.png", "导出数据"); private VCIJButton btnColumnSetting = this.createNewButton("table.png", "调整列宽"); /************************ 自定义按钮相关的 *********************************/ private List customButtons = new LinkedList(); // 自定义功能按钮 protected EventListenerList checkListeners = new EventListenerList(); public void addCheckListener(VCIJTableCheckListener checkListener){ listenerList.add(VCIJTableCheckListener.class, checkListener); } public void removeCheckListener(VCIJTableCheckListener checkListener){ listenerList.remove(VCIJTableCheckListener.class, checkListener); } /** * * @param dataProvider dataProvider */ public VCIJTablePanel(VCIJTableDataProvider dataProvider){ this.parentComponent = this; this.dataProvider = dataProvider; if(this.dataProvider != null){ this.tableModel = new VCIJTableModel(this, dataProvider.getColumns(), dataProvider.getClasses()); } } private VCIJScrollPane dataScrollPane = new VCIJScrollPane(); public VCIJScrollPane getDataScrollPane(){ return dataScrollPane; } private VCIJScrollPane getVCIJTableScrollPane(){ if(this.isEnableSorter()){ this.sorter = new VCIJTableSorter(this.tableModel); this.table = new VCIJTable(this.sorter); this.sorter.setTableHeader(this.table.getTableHeader()); }else{ this.table = new VCIJTable(tableModel); } this.setTableStyle(this.table); dataScrollPane = new VCIJScrollPane(); dataScrollPane.getViewport().add(this.table); return dataScrollPane; } private void addCheckBoxColumnToTable(){ if (isSingleCheckManager) { this.tbChkManager = new VCIJTableRadioManager(this, this.table); }else { this.tbChkManager = new VCIJTableCheckBoxManager(this, this.table); } tbChkManager.setHeaderShowCheckbox(0); } private void setTableStyle(VCIJTable table){ table.setFont(VCISwingUtil.FONT_DEFAULT); table.getTableHeader().setFont(VCISwingUtil.FONT_DEFAULT); table.setRowHeight(getRowHeight()); table.getTableHeader().setReorderingAllowed(isReorderingAllowed()); // 列可移动顺序 table.getTableHeader().setResizingAllowed(isResizingAllowed()); // 列可以以改变大小 table.setAutoResizeMode(getAutoResizeMode()); // 关闭自动计算列大小 table.setShowGrid(isShowGrid()); // 显示网络 table.setColumnSelectionAllowed(isColumnSelectionAllowed()); // 一次只能选择到一列。 table.setSelectionMode(getSelectionMode()); // 添加checkbox列,如果设置了不显示checkbox列,则列列宽为0(在后面构建时处理的) this.addCheckBoxColumnToTable(); SimpleMouseListener mouseListener = new SimpleMouseListener(this, this.table); table.addMouseListener(mouseListener); table.addMouseMotionListener(mouseListener); IndexColumnTableCellRender tableCellRender = new IndexColumnTableCellRender(this); tableCellRender.setTableCheckBoxManager(tbChkManager); for(int i = 0; i < this.table.getColumnModel().getColumnCount(); i++){ int width = this.getColumnDefaultWidth(); int widthMax = this.getColumnDefaultWidthMax(); if(i == 0){ width = 30; widthMax = 30; if(this.isShowCheckbox()){ if(this.getColumnWidthMaps().containsKey(i)){ width = this.getColumnWidthMaps().get(i); } } else{ width = 0; widthMax = 0; } } else if(i == 1){ width = 50; widthMax = 50; if(this.isShowRowNumber()){ if(this.getColumnWidthMaps().containsKey(i)){ width = this.getColumnWidthMaps().get(i); } } else { width = 0; widthMax = 0; } }else{ if(this.getColumnWidthMaps().containsKey(i)){ width = this.getColumnWidthMaps().get(i); } } table.getColumnModel().getColumn(i).setMinWidth(1); table.getColumnModel().getColumn(i).setMaxWidth(widthMax); table.getColumnModel().getColumn(i).setPreferredWidth(width); if(i != 0 ){ // table.getColumnModel().getColumn(i).setCellRenderer(new IndexColumnTableCellRender(this)); if (isImageColumn(table, i)) { VciIconRenderer iconRenderer = new VciIconRenderer(this); iconRenderer.setTableCheckBoxManager(tbChkManager); table.getColumnModel().getColumn(i).setCellRenderer(iconRenderer); continue; } table.getColumnModel().getColumn(i).setCellRenderer(tableCellRender); } } } private boolean isImageColumn(VCIJTable table, int i) { boolean rs = false; if (table.getModel().getColumnClass(i) == ImageIcon.class) { return true; } return rs; } /** * 构建TablePanel */ public void buildTablePanel(){ this.setLayout(new BorderLayout()); this.add(this.getVCIJTableScrollPane(), BorderLayout.CENTER); if(!this.isCustomButtonAutoScroll()) { this.add(this.getOperateButtonPanel(), BorderLayout.SOUTH); } else { VCIJScrollPane southJSP = new VCIJScrollPane(); southJSP.getViewport().add(this.getOperateButtonPanel()); int height = 0; if(isShowPaging() && showCustomButtons()){ height = 100; } else if(this.isShowPaging() || this.isShowExport() || this.showCustomButtons()){ height = 60; } southJSP.setPreferredSize(new Dimension(getWidth(), height)); southJSP.setMaximumSize(new Dimension(getWidth(), height)); southJSP.setMinimumSize(new Dimension(getWidth(), height)); this.add(southJSP, BorderLayout.SOUTH); } this.setDefaultStyle(); setProcessBarValueString(""); } public void buildTablePanel(boolean isSingleCheckManager){ this.isSingleCheckManager = isSingleCheckManager; this.buildTablePanel(); } private void setDefaultStyle(){ btnFirst.setEnabled(false); btnLast.setEnabled(false); btnPrev.setEnabled(false); btnNext.setEnabled(false); lblPageInfo.setText(MessageFormat.format(PAGE_INFO_FORMAT, new Object[]{0, 0, 0})); } /** * 返回底部操作的主Panel * @return */ private VCIJPanel getOperateButtonPanel(){ int rows = 1; int columns = 1; // 即包含分页按钮又包含自功能按钮,则将自定义功能按钮添加到第二行 if(isShowPaging() && showCustomButtons()){ rows += 1; } GridLayout layout = new GridLayout(rows, columns); VCIJPanel pal = new VCIJPanel(layout); pal.add(getPageButtonPanel()); // 将自定义功能按钮添加到第二 if(isShowPaging() && showCustomButtons()){ pal.add(getCustomButtonPanel()); } initPagerButtonAction(); return pal; } /** * 返回翻页按钮所在的Panel * @return */ private VCIJPanel getPageButtonPanel(){ VCIJPanel pal = new VCIJPanel(new FlowLayout(getPageButtonFlowAlign())); VCIJComboBox cbxPageSizes = getPageSizeComboBox(); if(this.isShowPaging()){ pal.add(cbxPageSizes); Dimension dim = new Dimension(25, 25); btnFirst.setMinimumSize(dim); btnFirst.setMaximumSize(dim); btnFirst.setPreferredSize(dim); pal.add(btnFirst); btnPrev.setMinimumSize(dim); btnPrev.setMaximumSize(dim); btnPrev.setPreferredSize(dim); pal.add(btnPrev); pal.add(txtPageIndex); btnGoPage.setMinimumSize(dim); btnGoPage.setMaximumSize(dim); btnGoPage.setPreferredSize(dim); pal.add(btnGoPage); btnNext.setMinimumSize(dim); btnNext.setMaximumSize(dim); btnNext.setPreferredSize(dim); pal.add(btnNext); btnLast.setMinimumSize(dim); btnLast.setMaximumSize(dim); btnLast.setPreferredSize(dim); pal.add(btnLast); btnReload.setMinimumSize(dim); btnReload.setMaximumSize(dim); btnReload.setPreferredSize(dim); pal.add(btnReload); pal.add(lblPageInfo); if(isShowExport()){ pal.add(btnExport); if(isShowColumnSetting()){ pal.add(btnColumnSetting); } addProcessBarToPanel(pal); } } else{ pal.setLayout(new FlowLayout(getCustomButtonFlowAlign())); // 不显示翻页按钮时,设置页大小为最大 pageSize = ((Integer)cbxPageSizes.getItemAt(cbxPageSizes.getItemCount() - 1)).intValue(); // 不显示翻页按钮,又存在自定义按钮时,则将自定义添加按钮添加到导出按钮的前面 if(showCustomButtons()){ for(VCIJButton btn : getCustomButtonsList()){ pal.add(btn); } } if(isShowExport()){ pal.add(btnExport); if(isShowColumnSetting()){ pal.add(btnColumnSetting); } addProcessBarToPanel(pal); } } return pal; } private boolean showCustomButtons(){ return (getCustomButtonsList() != null && getCustomButtonsList().size() > 0); } private VCIJComboBox getPageSizeComboBox(){ VCIJComboBox cbx = new VCIJComboBox(); int[] pageSizeList = getPageSizeList(); if(pageSizeList == null || (pageSizeList != null && pageSizeList.length == 0)){ setDefaultPageSizeList(cbx); } else{ //edit by guo 当表格的每页行数只有一个选项时,直接添加到下拉框中;有多个选项的时候,设置默认的为list的最后一项,并把前面的选项添加到下拉框中,注:最后一项不添加,已经重复 if(pageSizeList.length>1){ int existItem = pageSizeList[pageSizeList.length-1]; for(int i = 0; i < pageSizeList.length-1; i++){ int pageSize = pageSizeList[i]; if(i == 0){ setPageSize(pageSize); } cbx.addItem(pageSize); } cbx.setSelectedItem(existItem); setPageSize(existItem); } else { for(int i = 0; i < pageSizeList.length; i++){ int pageSize = pageSizeList[i]; if(i == 0){ setPageSize(pageSize); } cbx.addItem(pageSize); } } } this.cbxPageSize = cbx; return cbx; } private void setDefaultPageSizeList(VCIJComboBox cbx){ cbx.addItem(50); int base = 100; for(int i = 1; i < 20; i++){ if(i > 10){ cbx.addItem((i - 10 + 1) * 1000); }else{ cbx.addItem(i * base); } } cbx.setSelectedIndex(0); cbx.setSelectedItem(50); } private VCIJButton createNewButton(String icon, String toolTopText){ VCIJButton btn = new VCIJButton(); btn.setToolTipText(toolTopText); btn.setIcon(createImageIcon(icon)); return btn; } private ImageIcon createImageIcon(String icon){ return VCISwingUtil.createImageIcon(icon); } /** * 返回自定义功能按钮所在的Panel * @return */ private VCIJPanel getCustomButtonPanel(){ VCIJPanel pal = new VCIJPanel(new FlowLayout(getCustomButtonFlowAlign())); List btns = this.getCustomButtonsList(); // 如果不显示分页,但又需要显示导出,则将导出按钮与自定义功能按钮放在一行 if(!isShowPaging() && isShowExport()){ pal.add(btnExport); if(isShowColumnSetting()){ pal.add(btnColumnSetting); } addProcessBarToPanel(pal); } for(VCIJButton btn : btns){ pal.add(btn); } return pal; } private void addProcessBarToPanel(VCIJPanel pal){ if(isShowProgressBar()){ progressBar.setIndeterminate(true); pal.add(progressBar); pal.add(lblProgressStatus); Font font = new Font("宋体", Font.PLAIN, 14); lblProgressStatus.setForeground(Color.BLUE); lblProgressStatus.setFont(font); } } private void setProcessBarValueString(String value){ String text = value; boolean visible = true; if(value == null || "".equals(value)){ text = ""; visible = false; } lblProgressStatus.setText(text); progressBar.setVisible(visible); } private void setButtonsEnabled(boolean enabled){ List btns = getCustomButtonsList(); for(VCIJButton btn : btns){ btn.setEnabled(enabled); } cbxPageSize.setEnabled(enabled); btnFirst.setEnabled(enabled); btnPrev.setEnabled(enabled); btnNext.setEnabled(enabled); btnLast.setEnabled(enabled); btnReload.setEnabled(enabled); btnGoPage.setEnabled(enabled); btnExport.setEnabled(enabled); btnColumnSetting.setEnabled(enabled); } private JProgressBar progressBar = new JProgressBar(JProgressBar.HORIZONTAL,1,100); private VCIJLabel lblProgressStatus = new VCIJLabel(""); private void initPagerButtonAction(){ btnFirst.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToFirst(); }}); btnPrev.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToPrevious(); }}); btnNext.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToNext(); }}); btnLast.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToEnd(); }}); btnReload.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToReload(); }}); txtPageIndex.addKeyListener(new KeyAdapter(){public void keyReleased(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ENTER){ btnGoPage.doClick(); } }}); btnGoPage.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { pageToPage(); }}); cbxPageSize.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { pageToPageSizeChange(); }}); btnExport.setText("导出"); btnExport.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { exportData(); }}); btnColumnSetting.setText("列设置"); btnColumnSetting.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) { columnSetting(); }}); } private void pageToFirst(){ pageIndex = 1; this.refreshTableData(); } private void pageToPrevious(){ pageIndex--; if(pageIndex <= 0){ pageIndex = 1; } this.refreshTableData(); } private void pageToNext(){ pageIndex++; if(pageIndex > pageCount){ pageIndex = pageCount; } this.refreshTableData(); } private void pageToEnd(){ pageIndex = pageCount; this.refreshTableData(); } private void pageToReload(){ this.refreshTableData(); } private void pageToPage(){ String number = this.txtPageIndex.getText(); Pattern p = Pattern.compile("[0-9]+"); int maxIntStrLen = String.valueOf(Integer.MAX_VALUE).length(); if(!p.matcher(number).matches()){ VCIJOptionPane.showError(parentComponent, "只能按正整数查询"); this.setPageIndexToTextField(pageIndex); return; } else if(number.length() > maxIntStrLen){ VCIJOptionPane.showError(parentComponent, "输入的页数长度不得超过 " + String.valueOf(maxIntStrLen) + " 位"); this.setPageIndexToTextField(pageIndex); return; } else if(Double.parseDouble(number) > Integer.MAX_VALUE){ VCIJOptionPane.showError(parentComponent, "输入的页数不得大于 " + String.valueOf(Integer.MAX_VALUE)); this.setPageIndexToTextField(pageIndex); return; } int iptPageIndex = Integer.valueOf(number); if(iptPageIndex <= 0 || iptPageIndex > pageCount){ VCIJOptionPane.showError(parentComponent, MessageFormat.format("只能输入{0}-{1}之间的数值进行查询", new Object[]{1, pageCount})); this.setPageIndexToTextField(pageIndex); return; } pageIndex = iptPageIndex; this.refreshTableData(); this.txtPageIndex.requestFocus(); } private void setPageIndexToTextField(int pageIndex){ this.txtPageIndex.setText(String.valueOf(pageIndex)); } private void pageToPageSizeChange(){ VCISwingUtil.invokeLater(new Runnable(){ public void run(){ setPageSize(((Integer)cbxPageSize.getSelectedItem()).intValue()); setPageIndex(1); refreshTableData(); } }, 0); } private void exportData(){ if(tableModel.getList().size() <= 0){ VCIJOptionPane.showMessage(this, "没有数据可供导出!"); return; } final VCIJTablePanel tablePanel = this; VCISwingUtil.invokeLater(new Runnable() { public void run() { VCIJTablePanelExportFilterDialog dialog = new VCIJTablePanelExportFilterDialog(tablePanel); dialog.setModal(true); dialog.setVisible(true); } }, 0); } private void columnSetting(){ final VCIJTablePanel tablePanel = this; VCISwingUtil.invokeLater(new Runnable() { public void run() { ColumnSettingDialog dialog = new ColumnSettingDialog(tablePanel); dialog.buildDialog(); dialog.setModal(true); dialog.setVisible(true); } }, 0); } /** * 刷新数据 *

Description:

* * @author xchao * @time 2012-6-4 * @param datas 数据列表 */ public void refreshTableData(T[] datas){ refreshTableData(datas, true, true); } /** * 向Table中追加数据 *

Description:

* * @author xchao * @time 2012-6-5 * @param datas */ public void addTableData(T[] datas){ refreshTableData(datas, true, false); } /** * 调用DataProvider的getDatas(pageIndex, pageSize)来填充Table *

Description:

* * @author xchao * @time 2012-6-5 */ public void refreshTableData(){ if(isShowProgressBar()){ refreshTableDataByProgressBar(); } else { refreshTableDataDetail(); } } private ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); public ThreadPoolExecutor getThreadPoolExecutor() { return threadPoolExecutor; } public void setThreadPoolExecutor(ThreadPoolExecutor threadPoolExecutor) { this.threadPoolExecutor = threadPoolExecutor; } public void shutdownThreadPool(){ if(!threadPoolExecutor.isTerminating()){ threadPoolExecutor.shutdown(); } } private void refreshTableDataByProgressBar(){ final int[] seconds = new int[]{1}; final String loading = "正在查询数据,请稍等......"; final javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setProcessBarValueString(loading + " " + String.valueOf(seconds[0]) + "s"); seconds[0] += 1; } }); timer.start(); Runnable task = new Runnable() { public void run() { setProcessBarValueString(loading + " " + String.valueOf(seconds[0]) + "s"); seconds[0] += 1; setButtonsEnabled(false); refreshTableDataDetail(); setProcessBarValueString(""); setButtonsEnabled(true); setButtonEnables(); timer.stop(); } }; // Thread t = new Thread(task); // t.start(); threadPoolExecutor.submit(task); } private void refreshTableDataDetail(){ if(dataProvider != null){ // 调用DataProvider查询数据 synchronized (VCIJTableDataProvider.class) { T[] datas = dataProvider.getDatas(getPageIndex(), getPageSize()); // 在查询数据的同时获取数据总数 total = dataProvider.getTotal(); refreshTableData(datas, false, true); } } } /** * *

Description:

* * @author xchao * @time 2012-6-5 * @param datas * @param fromManualData 是否来自手动刷新的标识 * @param isClear 是否清空已有数据的标识 */ private synchronized void refreshTableData(final T[] datas, final boolean fromManualData, final boolean isClear){ refreshTableDataBefore(); //System.err.println("datas length:"+datas.length+Thread.currentThread().getName()); //System.out.println(Thread.currentThread().getName()); try{ int pageIndex = getPageIndex(); int pageSize = getPageSize(); int pageCount = getPageCount(); if(datas != null){ if(fromManualData){ pageCount = 1; pageIndex = 1; total = datas.length; }else{ if(total == 0){ pageCount = 0; pageCount = 0; } else { pageCount = total / pageSize; if(total % pageSize != 0){ pageCount += 1; } pageCount = pageCount == 0 ? 1 : pageCount; } } int baseLength = tableModel.getList().size(); // 如果清空当前的数据,则重新设置CheckBox的总数 if(isClear){ baseLength = 0; if (tableModel.getRowCount() > 0) tableModel.clear(); } else{ // 不清空时,总数当前的总数+datas.length total = datas.length + baseLength; } // 设置Table的CheckBox总数,此数不等于total, // total是全部数据的总数 // CheckBox是Table显示时,需要的CheckBox的总数,有多少条数据显示,有需要多少个CheckBox tbChkManager.addCheckBoxs(baseLength + datas.length); for(T dataObj : datas){ tableModel.addRow(dataProvider.getNewRowNode(dataObj)); } tableModel.fireTableDataChanged(); setPageIndexToTextField(pageIndex); } setPageIndex(pageIndex); setPageSize(pageSize); setPageCount(pageCount); java.awt.EventQueue.invokeLater(new Runnable(){ public void run() { setButtonEnables(); } }); }catch(Exception e){ e.printStackTrace(); VCIJOptionPane.showError(parentComponent, "加载数据的内部过程中出现错误!"); } finally{ refreshTableDataAfter(); } } private void refreshTableDataBefore(){ setCursor(new Cursor(Cursor.WAIT_CURSOR)); } private void refreshTableDataAfter(){ setCursor(new Cursor(0)); } private void setButtonEnables(){ btnFirst.setEnabled((pageIndex != 1));// 只要当前不每一页就可用 btnLast.setEnabled(pageIndex != pageCount);// 只要当前不是最后一页就可用 btnPrev.setEnabled(pageIndex > 1); btnNext.setEnabled(pageIndex < pageCount); lblPageInfo.setText(MessageFormat.format(PAGE_INFO_FORMAT, new Object[]{total, pageCount, pageIndex})); } /******************** getter&setter ********************/ public void setTableSorter(VCIJTableSorter sorter){ this.sorter = sorter; } public VCIJTableSorter getTableSorter(){ return sorter; } public int getHeaderHeight() { return headerHeight; } public void setHeaderHeight(int headerHeight) { this.headerHeight = headerHeight; } public int getRowHeight() { return rowHeight; } public void setRowHeight(int rowHeight) { this.rowHeight = rowHeight; } public boolean isShowCheckbox() { return showCheckbox; } public void setShowCheckbox(boolean showCheckbox) { showCheckbox = true; this.showCheckbox = showCheckbox; } public boolean isShowRowNumber() { return showRowNumber; } public void setShowRowNumber(boolean showRowNumber) { this.showRowNumber = showRowNumber; } public boolean isShowPaging() { return showPaging; } public void setShowPaging(boolean showPaging) { this.showPaging = showPaging; } public boolean isShowExport() { return showExport; } public void setShowExport(boolean showExport) { this.showExport = showExport; } public boolean isShowColumnSetting() { return showColumnSetting; } public void setShowColumnSetting(boolean showColumnSetting) { this.showColumnSetting = showColumnSetting; } public boolean isEnableSorter() { return enableSorter; } public void setEnableSorter(boolean enableSorter) { this.enableSorter = enableSorter; } /** * 是否启用在表格单元格上单击时,自动选中CheckBox效果 *

Description:

* * @author xchao * @time 2012-9-19 * @return */ public boolean isEnableMouseClickEffect() { return enableMouseClickEffect; } /** * 是否启用在表格单元格上单击时,自动选中CheckBox效果 *

Description:

* * @author xchao * @time 2012-9-19 * @param enableMouseClickEffect */ public void setEnableMouseClickEffect(boolean enableMouseClickEffect) { this.enableMouseClickEffect = enableMouseClickEffect; } /** * 是否启用鼠标在单元格上移动时,当前行高亮显示的效果 *

Description:

* * @author xchao * @time 2012-9-19 * @return */ public boolean isEnableMouseMoveEffect() { return enableMouseMoveEffect; } /** * 设置 是否启用鼠标在单元格上移动时,当前行高亮显示的效果 *

Description:

* * @author xchao * @time 2012-9-19 * @param enableMouseMoveEffect */ public void setEnableMouseMoveEffect(boolean enableMouseMoveEffect) { this.enableMouseMoveEffect = enableMouseMoveEffect; } /** * 返回 是否启用 鼠标停留在数据行上时,行颜色自动高亮 * @return */ public boolean isEnableRowColorChangeInMouseHover() { return enableRowColorChangeInMouseHover; } /** * 设置 是否启用 鼠标停留在数据行上时,行颜色自动高亮 * @param enableRowColorChangeInMouseHover */ public void setEnableRowColorChangeInMouseHover( boolean enableRowColorChangeInMouseHover) { this.enableRowColorChangeInMouseHover = enableRowColorChangeInMouseHover; } /** * 返回 是否启用鼠标按下拖动(框选)时,执行将数据行选中 * @return */ public boolean isEnbleMouseDraggedChecked() { return enbleMouseDraggedChecked; } /** * 设置 是否启用鼠标按下拖动(框选)时,执行将数据行选中 * @param enbleMouseDraggedChecked */ public void setEnbleMouseDraggedChecked(boolean enbleMouseDraggedChecked) { this.enbleMouseDraggedChecked = enbleMouseDraggedChecked; } public Integer getColumnDefaultWidth() { return columnDefaultWidth; } public void setColumnDefaultWidth(Integer columnDefaultWidth) { this.columnDefaultWidth = columnDefaultWidth; } public Integer getColumnDefaultWidthMax() { return columnDefaultWidthMax; } public void setColumnDefaultWidthMax(Integer columnDefaultWidthMax) { this.columnDefaultWidthMax = columnDefaultWidthMax; } public HashMap getColumnWidthMaps() { return columnWidthMaps; } public void setColumnWidthMaps(HashMap columnWidthMaps) { this.columnWidthMaps = columnWidthMaps; } public int getPageButtonFlowAlign() { return pageButtonFlowAlign; } public void setPageButtonFlowAlign(int pageButtonFlowAlign) { this.pageButtonFlowAlign = pageButtonFlowAlign; } public int getCustomButtonFlowAlign() { return customButtonFlowAlign; } public void setCustomButtonFlowAlign(int customButtonFlowAlign) { this.customButtonFlowAlign = customButtonFlowAlign; } public boolean isCustomButtonAutoScroll() { return customButtonAutoScroll; } public void setCustomButtonAutoScroll(boolean customButtonAutoScroll) { this.customButtonAutoScroll = customButtonAutoScroll; } public VCIJTableModel getTableModel() { return tableModel; } public VCIJTable getTable() { return table; } public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex){ this.pageIndex = pageIndex; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize){ this.pageSize = pageSize; } public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int[] getPageSizeList() { return pageSizeList; } public void setPageSizeList(int[] pageSizeList) { this.pageSizeList = pageSizeList; } public VCIJTableDataProvider getDataProvider() { return dataProvider; } public void setDataProvider(VCIJTableDataProvider dataProvider) { this.dataProvider = dataProvider; } public void setTableModel(VCIJTableModel tableModel) { this.tableModel = tableModel; } public void setTable(VCIJTable table) { this.table = table; } @Deprecated public LinkedList getCustomButtons() { List res = getCustomButtonsList(); if(res instanceof LinkedList){ return (LinkedList)res; } LinkedList list = new LinkedList(); for(VCIJButton btn : customButtons){ list.add(btn); } return list; } public List getCustomButtonsList() { return customButtons; } @Deprecated public void setCustomButtons(LinkedList customButtons) { this.customButtons = customButtons; } public void setCustomButtons(List customButtons) { this.customButtons = customButtons; } public boolean isReorderingAllowed() { return reorderingAllowed; } public void setReorderingAllowed(boolean reorderingAllowed) { this.reorderingAllowed = reorderingAllowed; } public boolean isResizingAllowed() { return resizingAllowed; } public void setResizingAllowed(boolean resizingAllowed) { this.resizingAllowed = resizingAllowed; } public boolean isShowGrid() { return showGrid; } public void setShowGrid(boolean showGrid) { this.showGrid = showGrid; } public boolean isColumnSelectionAllowed() { return columnSelectionAllowed; } public void setColumnSelectionAllowed(boolean columnSelectionAllowed) { this.columnSelectionAllowed = columnSelectionAllowed; } public int getAutoResizeMode() { return autoResizeMode; } public void setAutoResizeMode(int autoResizeMode) { this.autoResizeMode = autoResizeMode; } public int getSelectionMode() { return selectionMode; } public void setSelectionMode(int selectionMode) { this.selectionMode = selectionMode; } public boolean isShowProgressBar() { return showProgressBar; } public void setShowProgressBar(boolean showProgressBar) { this.showProgressBar = showProgressBar; } /** * 返回 是否是最后点击行才被选中,同时清空当前已经选中的其它数据模式是否生效 * @return */ public boolean isLastClickRowToChecked() { return lastClickRowToChecked; } /** * 返回 是否是最后点击行才被选中,同时清空当前已经选中的其它数据模式是否生效 * @param lastClickRowToChecked 是否是最后点击行才被选中,同时清空当前已经选中的其它数据模式是否生效 */ public void setLastClickRowToChecked(boolean lastClickRowToChecked) { this.lastClickRowToChecked = lastClickRowToChecked; } /******************** getter&setter end ********************/ public List getEdiableColumnList() { return ediableColumnList; } public void setEdiableColumnList(List ediableColumnList) { this.ediableColumnList = ediableColumnList; } /** * 返回是否可以进行可编辑状态 * @return */ public boolean isCellEditable() { return cellEditable; } /** * 设置可以进入可编辑状态 * @param cellEditable 是否可以进入可编辑状态 true:是 false:否 */ public void setCellEditable(boolean cellEditable) { this.cellEditable = cellEditable; } /******************** public service&interface ********************/ /** * 返回选择的对象的行索引 * @return */ public int[] getSelectedRowIndexs(){ int[] res = null; if(this.tbChkManager == null) { res = this.table.getSelectedRows(); }else{ res = this.tbChkManager.getSelectedIndexs(); } return res; } @SuppressWarnings("hiding") private LinkedList convertListToLinkedList(List list){ LinkedList res = new LinkedList(); for (int i = 0; i < list.size(); i++) { res.add(list.get(i)); } return res; } /** * 返回选择的对象 * @return */ @Deprecated public LinkedList getSelectedRowObjects(){ List list = getSelectedRowObjectsList(); if(list instanceof LinkedList){ return (LinkedList)list; } return convertListToLinkedList(list); } /** * 返回选择的对象 * @return */ public List getSelectedRowObjectsList(){ int[] rows = this.getSelectedRowIndexs(); if(this.isEnableSorter()){ int[] rowss = this.sorter.getSelectTypeTableModelRows(rows); rows = rowss; } List list = new LinkedList(); for(int row : rows){ list.add(this.tableModel.getList().get(row).getObject()); } return list; } /** * 返回当前页的数据对象 * @return */ @Deprecated public LinkedList getObjects(){ List list = getObjectsList(); if(list instanceof LinkedList){ return (LinkedList)list; } return convertListToLinkedList(list); } /** * 返回当前页的数据对象 * @return */ public List getObjectsList(){ LinkedList list = new LinkedList(); for(int row = 0; row < this.tableModel.getList().size(); row++){ list.add(this.tableModel.getList().get(row).getObject()); } return list; } /** * 返回全部页的数据对象 * @return */ @Deprecated public LinkedList getObjectsAll(){ List list = getObjectsAllList(); if(list instanceof LinkedList){ return (LinkedList)list; } return convertListToLinkedList(list); } /** * 返回全部页的数据对象 * @return */ public List getObjectsAllList(){ List list = getObjectsList(); int pageIndex = getPageIndex(); int pageSize = getPageSize(); int pageCount = getPageCount(); for(;pageIndex <= pageCount; pageIndex++){ T[] datas = dataProvider.getDatas(pageIndex, pageSize); for(T data : datas){ list.add(data); } } return list; } /** * 返回指定页的数据 * @return */ @Deprecated public List getObjectsByPageIndex(int pageIndex){ List list = getObjectsByPageIndexList(pageIndex); if(list instanceof LinkedList){ return (LinkedList)list; } return convertListToLinkedList(list); } /** * 返回指定页的数据 * @return */ public List getObjectsByPageIndexList(int pageIndex){ List list = new LinkedList(); T[] datas = dataProvider.getDatas(pageIndex, pageSize); for(T data : datas){ list.add(data); } return list; } /** * 返回全部页的TableNode对象 *

Description:

* * @author xchao * @time 2012-6-15 * @param pageIndex * @return */ @Deprecated public LinkedList> getTableNodesInAllPage(){ List> list = getTableNodesInAllPageList(); if(list instanceof LinkedList){ return (LinkedList>)list; } LinkedList> res = new LinkedList>(); for (int i = 0; i < list.size(); i++) { res.add(list.get(i)); } return res; } /** * 返回全部页的TableNode对象 *

Description:

* * @author xchao * @time 2012-6-15 * @param pageIndex * @return */ public List> getTableNodesInAllPageList(){ List> list = new LinkedList>(); for(int pageIndex = 1; pageIndex >= getPageCount(); pageIndex++){ T[] datas = dataProvider.getDatas(pageIndex, pageSize); for(T data : datas){ list.add(dataProvider.getNewRowNode(data)); } } return list; } /** * 返回指定页的TableNode对象 *

Description:

* * @author xchao * @time 2012-6-15 * @param pageIndex * @return */ public LinkedList> getTableNodesByPageIndex(int pageIndex){ List> list = getTableNodesByPageIndexList(pageIndex); if(list instanceof LinkedList){ return (LinkedList>)list; } LinkedList> res = new LinkedList>(); for (int i = 0; i < list.size(); i++) { res.add(list.get(i)); } return res; } /** * 返回指定页的TableNode对象 *

Description:

* * @author xchao * @time 2012-6-15 * @param pageIndex * @return */ public List> getTableNodesByPageIndexList(int pageIndex){ List> list = new LinkedList>(); T[] datas = dataProvider.getDatas(pageIndex, pageSize); for(T data : datas){ list.add(dataProvider.getNewRowNode(data)); } return list; } /** * 根据行索引返回对象 * @param index * @return */ public T getSpecialObjectByRowIndex(int index){ int[] rows = {index}; if(this.isEnableSorter()){ int[] rowss = this.sorter.getSelectTypeTableModelRows(rows); rows = rowss; } T node = this.tableModel.getList().get(rows[0]).getObject(); return node; } /** * 清空勾选择的CheckBox */ public void clearCheckboxSelected(){ if(tbChkManager != null){ tbChkManager.clearSelect(); } } /** * 添加勾选指定的行 * @param indexIndex 行索引 */ public void addClickedRow(int rowIndex){ if(tbChkManager != null){ tbChkManager.clickedRow(rowIndex); } } /******************** public service&interface ********************/ @SuppressWarnings("hiding") class SimpleMouseListener implements MouseListener, MouseMotionListener{ private VCIJTablePanel tablePanel = null; private VCIJTable table = null; public SimpleMouseListener(VCIJTablePanel tablePanel, VCIJTable table){ this.tablePanel = tablePanel; this.table = table; } boolean draggedInvoke = false; public void mouseDragged(MouseEvent e) { if(!tablePanel.isEnableMouseMoveEffect()){ return; } draggedInvoke = true; } public void mouseMoved(MouseEvent e) { if(!tablePanel.isEnableMouseMoveEffect()){ return; } int rowIndex = table.rowAtPoint(e.getPoint()); if(!tablePanel.isLastClickRowToChecked()){ if(!tbChkManager.getSelectedIndexsSet().contains(rowIndex)){ if(isEnableRowColorChangeInMouseHover()){ processCurrentRowColor(rowIndex); } } } else{ } updateUI(); } public void mouseClicked(MouseEvent e) { int column = table.columnAtPoint(e.getPoint()); int rowIndex = table.rowAtPoint(e.getPoint()); // 单元格上不启用点击效果时,如果单击的是第一列,且第一列又是CheckBox列,则此时依然需要改变选择行的颜色 if(!tablePanel.isEnableMouseClickEffect()){ if(tablePanel.isShowCheckbox()){ // 此时,非CheckBox列时,不作响应 if(column != 0){ return; } } } if(column == 0){ tbChkManager.clickedRow(rowIndex); } else { if(!tablePanel.isLastClickRowToChecked()){ tbChkManager.clickedRow(rowIndex); } else { if(!tbChkManager.getSelectedIndexsSet().contains(rowIndex)){ tbChkManager.clearSelect(); } tbChkManager.clickedRow(rowIndex); } } } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { if(!tablePanel.isEnableMouseMoveEffect()){ return; } int columnIndexByPoint = table.columnAtPoint(e.getPoint()); if(draggedInvoke){ draggedInvoke = false; int[] rowIndexs = table.getSelectedRows(); if(!tablePanel.isLastClickRowToChecked()){ tbChkManager.clearSelect(); for(int rowIndex : rowIndexs){ tbChkManager.clickedRow(rowIndex); } } else { if(columnIndexByPoint != 0){ int rowIndex = tablePanel.getTable().getSelectedRow(); if(!tbChkManager.getSelectedIndexsSet().contains(rowIndex)){ tbChkManager.clearSelect(); } tbChkManager.clickedRow(rowIndex); } } } updateUI(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } public void processCurrentRowColor(int rowIndex){ Set set = tbChkManager.getSelectedIndexsSet(); if(!set.contains(rowIndex)){ setRowBackgroundColor(rowIndex, VCISwingUtil.JTABLE_ROW_BACKGROUND_COLOR_HOVER); } else{ setRowBackgroundColor(rowIndex, VCISwingUtil.JTABLE_ROW_BACKGROUND_COLOR_CHECKED); } } public Color getDefaultBackgroundColor(int rowIndex){ Color color = (rowIndex % 2) == 0 ? VCISwingUtil.JTABLE_ROW_BACKGROUND_COLOR_EVEN : VCISwingUtil.JTABLE_ROW_BACKGROUND_COLOR_ODD; return color; } public void setRowBackgroundColor(final int changedRow, final Color color){ int columnCount = table.getColumnCount(); int startColumn = this.isShowCheckbox() ? 1 : 0; IndexColumnTableCellRender tableCellRender = null; for(int i = startColumn; i < columnCount; i++){ tableCellRender = new IndexColumnTableCellRender(this) { /** * */ private static final long serialVersionUID = 6645602836163826027L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component compt = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if(row == changedRow){ table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); setBackground(color); } return compt; } }; tableCellRender.setTableCheckBoxManager(tbChkManager); table.getColumnModel().getColumn(i).setCellRenderer(tableCellRender); } updateUI(); } }