package com.vci.client.ui.swing.components.table.setting; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.text.MessageFormat; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; import javax.swing.DefaultCellEditor; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import com.vci.client.ui.swing.VCISwingUtil; import com.vci.client.ui.swing.components.VCIJButton; import com.vci.client.ui.swing.components.VCIJDialog; import com.vci.client.ui.swing.components.VCIJIntegerTextField; 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.table.AbstractVCIJTableDataProvider; import com.vci.client.ui.swing.components.table.VCIJTableNode; import com.vci.client.ui.swing.components.table.VCIJTablePanel; public class ColumnSettingDialog extends VCIJDialog implements ActionListener { /** * */ private static final long serialVersionUID = 2685955148137843953L; private VCIJTablePanel tablePanel = null; private VCIJIntegerTextField txtWidth = new VCIJIntegerTextField("100"); private VCIJButton btnWidthSet = VCISwingUtil.createVCIJButton("widthSet", "设定", "设定", "table_edit.png", this); private VCIJButton btnOk = VCISwingUtil.createVCIJButton("ok", "确定", "确定", "accept.png", this); private VCIJButton btnCancel = VCISwingUtil.createVCIJButton("cancel", "取消", "取消", "cancel.png", this); public ColumnSettingDialog(VCIJTablePanel tablePanel){ super(VCISwingUtil.getClientMainFrame(), true); this.tablePanel = tablePanel; setTitle("列设置"); setSize(new Dimension(700, 550)); this.setLocationRelativeTo(tablePanel); setModal(true); } public void buildDialog(){ init(); } private void init(){ setLayout(new BorderLayout()); add(getNouthPanel(), BorderLayout.NORTH); add(getCenterContentPanel(), BorderLayout.CENTER); add(getSouthButtonPanel(), BorderLayout.SOUTH); } private VCIJPanel getNouthPanel(){ VCIJPanel pal = new VCIJPanel(); return pal; } private SettingTableDataProvider dataProvider = null; private VCIJTablePanel settingTablePanel = null; private VCIJPanel getCenterContentPanel(){ VCIJPanel pal = new VCIJPanel(); dataProvider = new SettingTableDataProvider(); settingTablePanel = new VCIJTablePanel(dataProvider); settingTablePanel.setShowCheckbox(true); settingTablePanel.setShowPaging(false); settingTablePanel.setShowExport(false); settingTablePanel.setShowColumnSetting(false); settingTablePanel.setReorderingAllowed(false); settingTablePanel.setEnableSorter(false); LinkedList editableColumnList = new LinkedList(); editableColumnList.add(3);editableColumnList.add(4); settingTablePanel.setEdiableColumnList(editableColumnList); LinkedHashMap columnWidthMaps = new LinkedHashMap(); columnWidthMaps.put(3, 60);columnWidthMaps.put(4, 40); settingTablePanel.setColumnWidthMaps(columnWidthMaps); settingTablePanel.buildTablePanel(); settingTablePanel.refreshTableData(); settingTablePanel.getTable().getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new VCIJIntegerTextField(""))); settingTablePanel.getTable().getColumnModel().getColumn(3).getCellEditor().addCellEditorListener(new CellEditorListener() { @Override public void editingStopped(ChangeEvent e) { editionEvent(e); } @Override public void editingCanceled(ChangeEvent e) { editionEvent(e); } private void editionEvent(ChangeEvent e){ DefaultCellEditor editor = (DefaultCellEditor)e.getSource(); Object value = editor.getCellEditorValue(); setValueToText(value); } }); settingTablePanel.getTable().addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { settingTablePanel.getTable().getColumnModel().getColumn(3).getCellEditor().stopCellEditing(); settingTablePanel_mouseClicked(e); } }); pal = settingTablePanel; return pal; } private void settingTablePanel_mouseClicked(MouseEvent e){ Point point = e.getPoint(); int row = settingTablePanel.getTable().rowAtPoint(point); int column = settingTablePanel.getTable().columnAtPoint(point); if(row < 0 || column < 0) return; VCIJTableNode tableNode = settingTablePanel.getTableModel().getList().get(row); Object value = tableNode.getPropertyValue(COLUMN_WIDTH); setValueToText(value); } private void setValueToText(Object value){ txtWidth.setText(String.valueOf(value)); } private Pattern ptnNumber = Pattern.compile("[0-9]+"); final String COLUMN_NAME = "属性名称"; final String COLUMN_WIDTH = "宽度"; final String COLUMN_VISIABLE = "显示"; private String[] tablePanelColumns = new String[0]; private LinkedHashMap tablePanelColumnNameToIndexMap = new LinkedHashMap(); class SettingTableDataProvider extends AbstractVCIJTableDataProvider { { tablePanelColumns = tablePanel.getDataProvider().getSpecialColumns(); int index = ((AbstractVCIJTableDataProvider)tablePanel.getDataProvider()).getDataColumnStartIndex(); for(String columnName : tablePanelColumns){ tablePanelColumnNameToIndexMap.put(columnName, index++); } } @Override public Class[] getClasses() { String[] columns = getColumns(); this.classes = new Class[this.getColumns().length]; classes[0] = Boolean.class; for (int i = 1; i < classes.length; i++) { classes[i] = columns[i].getClass(); if(columns[i].equals(COLUMN_VISIABLE)){ classes[i] = Boolean.class; } } return this.classes; } @Override public String[] getSpecialColumns() { return new String[]{COLUMN_NAME, COLUMN_WIDTH}; } @Override public int getTotal() { return tablePanel.getDataProvider().getSpecialColumns().length; } @Override public VCIJTableNode getNewRowNode(SettingDataStruct dataObj) { VCIJTableNode tableNode = new VCIJTableNode(dataObj); tableNode.setPropertyValue(COLUMN_NAME, dataObj.attrName); int width = getColumnWidth(dataObj.attrName); tableNode.setPropertyValue(COLUMN_WIDTH, width); tableNode.setPropertyValue(COLUMN_VISIABLE, true); return tableNode; } private int getColumnWidth(String columnName){ int res = tablePanel.getColumnDefaultWidth(); if(tablePanelColumnNameToIndexMap.containsKey(columnName)){ TableColumnModel tcm = tablePanel.getTable().getColumnModel(); int columnIndex = tablePanelColumnNameToIndexMap.get(columnName); if(columnIndex < tcm.getColumnCount()){ TableColumn tc = tcm.getColumn(columnIndex); res = tc.getWidth(); } } return res; } @SuppressWarnings("unchecked") @Override public SettingDataStruct[] getDatas(int pageIndex, int pageSize) { LinkedList list = new LinkedList.SettingDataStruct>(); String[] columns = tablePanel.getDataProvider().getSpecialColumns(); for(String column : columns){ SettingDataStruct data = new SettingDataStruct(); data.attrName = column; list.add(data); } return list.toArray(new ColumnSettingDialog.SettingDataStruct[]{}); } } class SettingDataStruct{ String attrName = ""; int width = tablePanel.getColumnDefaultWidth(); int index = 1; } private VCIJPanel getSouthButtonPanel(){ VCIJPanel pal = new VCIJPanel(new BorderLayout()); VCIJLabel lblInfo = new VCIJLabel( "" + "

1、鼠标双击数据行或按F2键,进入编辑状态,按回车键(Enter)结束编辑

" + ""); Font f = lblInfo.getFont(); lblInfo.setFont(new Font(f.getFamily(), Font.BOLD, 14)); pal.add(lblInfo, BorderLayout.CENTER); VCIJPanel palBtn = new VCIJPanel(); VCIJLabel lbl = new VCIJLabel(COLUMN_WIDTH); palBtn.add(lbl); txtWidth.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { widthSet(); } }); palBtn.add(txtWidth); palBtn.add(btnWidthSet); palBtn.add(btnOk); palBtn.add(btnCancel); pal.add(palBtn, BorderLayout.SOUTH); return pal; } @Override public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); if(actionCommand.equals(btnWidthSet.getActionCommand())) widthSet(); else if(actionCommand.equals(btnOk.getActionCommand())) ok(); else if(actionCommand.equals(btnCancel.getActionCommand())) cancel(); } private void widthSet(){ int[] rows = settingTablePanel.getSelectedRowIndexs(); if(rows.length == 0){ VCIJOptionPane.showError(this, "请先选择数据!"); return; } if(!isValidNumber(0, "", txtWidth.getText(), false)){ return; } List> list = settingTablePanel.getTableModel().getList(); for(int row : rows){ VCIJTableNode tableNode = list.get(row); tableNode.setPropertyValue(COLUMN_WIDTH, txtWidth.getText()); } settingTablePanel.validate(); settingTablePanel.updateUI(); } private void ok(){ if(!columnWidthIsOk()){ return; } else { setTablePanelWidth(); } tablePanel.validate(); tablePanel.updateUI(); close(DialogResult.OK); } private void setTablePanelWidth(){ TableColumnModel tcm = tablePanel.getTable().getColumnModel(); LinkedList> list = settingTablePanel.getTableModel().getList(); for(int i = 0; i < list.size(); i++){ VCIJTableNode tableNode = list.get(i); String columnName = tableNode.getPropertyValue(COLUMN_NAME).toString(); if(tablePanelColumnNameToIndexMap.containsKey(columnName)){ int columnIndex = tablePanelColumnNameToIndexMap.get(columnName); if(columnIndex < tcm.getColumnCount()){ TableColumn tc = tcm.getColumn(columnIndex); int width = tableNode.getObject().width; tc.setWidth(width); tc.setMaxWidth(width*2); tc.setPreferredWidth(width); } } } } private boolean columnWidthIsOk(){ boolean res = false; LinkedList> list = settingTablePanel.getTableModel().getList(); for(int i = 0; i < list.size(); i++){ VCIJTableNode tableNode = list.get(i); String columnName = tableNode.getPropertyValue(COLUMN_NAME).toString(); String widthString = tableNode.getPropertyValue(COLUMN_WIDTH).toString(); if(!isValidNumber(i+1, columnName, widthString, true)){ return false; } int width = Integer.valueOf(widthString); boolean visiable = Boolean.valueOf(tableNode.getPropertyValue(COLUMN_VISIABLE).toString()); if(!visiable){ width = 0; } tableNode.setPropertyValue(COLUMN_WIDTH, String.valueOf(width)); tableNode.getObject().width = width; res = true; } return res; } private boolean isValidNumber(int rowIndex, String columnName, String numberString, boolean showRowInfo){ boolean res = false; String errorMessage = "列宽只能是大于等于0、小于等于2000的正整数"; if(showRowInfo){ errorMessage = MessageFormat.format( "第{0}行‘{1}’的" + errorMessage, String.valueOf(rowIndex), columnName); } boolean isNumber = ptnNumber.matcher(numberString).matches(); if(!isNumber){ VCIJOptionPane.showError(this, errorMessage); return false; } try{ Integer i = Integer.valueOf(numberString); if(i < 0 || i > 2000) { throw new NumberFormatException(errorMessage); } res = true; }catch(Exception ex){ VCIJOptionPane.showError(this, errorMessage); return false; } return res; } private void cancel(){ close(DialogResult.CANCEL); } private void close(DialogResult dialogResult){ dispose(); setVisible(false); setDialogResult(dialogResult); } }