package com.vci.client.ui.swing.components.table; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.DefaultCellEditor; import javax.swing.JRadioButton; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; /** * *

Title:

*

Description:

*

Copyright: Copyright (c) 2012

*

Company: VCI

* @author xchao * @time 2012-5-10 * @version 1.0 */ public class VCIJTableRadioManager implements IVCIJTableBaseCheckManager { public static final int SELECT_PART = 0; public static final int SELECT_ALL = 1; public static final int SELECT_NONE = 2; private byte[] tableCheck = new byte[0]; private IndexJRadioButton[] templetRadioButton = new IndexJRadioButton[] { new IndexJRadioButton((String) null, false), new IndexJRadioButton((String) null, true) }; private JTable table; private JRadioButton headerRadioButton; private Map selectedIndexMap = new HashMap(); private int tableCheckedCount = 0; private boolean fireChanged = true; private int headerCheckBoxColumn = 0; private int checkBoxColumn = 0; private static final int DFAULT_MAX_WIDTH = 23; private static final int DFAULT_MIN_WIDTH = 23; private static final int DFAULT_PREFERRED_WIDTH = 23; private int maxWidth = DFAULT_MAX_WIDTH; private int minWidth = DFAULT_MIN_WIDTH; private int preferredWidth = DFAULT_PREFERRED_WIDTH; private IndexJRadioButton editorCheckBox = new IndexJRadioButton(); private MouseListener nowMouseListen = null; private ActionListener actionChange = new ActionListener() { public void actionPerformed(ActionEvent e) { clickCheckBox(table.getEditingRow()); checkedChanged2(table.getEditingRow()); } }; private void responseCheckListener(ActionEvent ae){ VCIJTableCheckListener[] checkListeners = tablePanel.getListeners(VCIJTableCheckListener.class); if(checkListeners != null){ for (int i = 0; i < checkListeners.length; i++) { } } } private void setTableModelFireTableDataChanged(){ table.getModel().addTableModelListener(new TableModelListener(){ public void tableChanged(TableModelEvent e) { clearSelect(); } }); } public void close() { clear(); table = null; } private void clear() { tableCheck = new byte[0]; // @jve:decl-index=0: table = null; headerRadioButton = null; selectedIndexMap = new HashMap(); tableCheckedCount = 0; fireChanged = true; // addCheckBox = null; headerCheckBoxColumn = 0; checkBoxColumn = 0; removeSet(); } public void setCheckBoxColumn(int col) { checkBoxColumn = col; if (table != null) { setColumnAttributes(); } } public void setSelected(int[] indexs) { for (int i = 0; i < indexs.length; i++) { tableCheck[indexs[i]] = 1; tableCheckedCount++; } updateStata(); table.revalidate(); table.repaint(); } private void setColumnAttributes() { TableColumn tc = table.getColumnModel().getColumn(checkBoxColumn); tc.setPreferredWidth(preferredWidth); tc.setMaxWidth(maxWidth); tc.setMinWidth(minWidth); tc.setCellRenderer(getCheckBoxsCellRenderer()); tc.setCellEditor(getCheckBoxsCellEditor(true)); } private void addTableMouseListener() { nowMouseListen = new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { if (e.getButton() != java.awt.event.MouseEvent.BUTTON1) return; if (e.getClickCount() == 1) { int selectRow = VCIJTableRadioManager.this.table .getSelectedRow(); if (selectRow > -1) { int col = VCIJTableRadioManager.this.table .columnAtPoint(e.getPoint()); if (col != -1 && col == checkBoxColumn) { // add by xchao 2012.08.20 // 放开 clickedRow(selectRow) 将导致,点击列头的CheckBox时,需要单击两次才能实现选择中效果 // 估计是与table添加了鼠标单击事件导致的,将其注释掉时,效果与预期一致,因此注释了此行 // clickedRow(selectRow); // add by xchao 2012.08.20 } } } } /** * Invoked when the mouse exits a component. */ public void mouseExited(MouseEvent e) { } }; table.addMouseListener(nowMouseListen); } public void clickedRow(int rowIndex){ clearSelected(); clickCheckBox(rowIndex); checkedChanged(rowIndex); table.revalidate(); table.repaint(); } private void clearSelected() { Arrays.fill(tableCheck, new Byte("0")); selectedIndexMap.clear(); tableCheckedCount = 0; } protected VCIJTablePanel tablePanel = null; public VCIJTableRadioManager(VCIJTablePanel tablePanel, JTable table) { this.tablePanel = tablePanel; this.table = table; addTableMouseListener(); setColumnAttributes(); setTableModelFireTableDataChanged(); } public void removeSet() { if (table != null) { table.removeMouseListener(nowMouseListen); TableColumn tc = table.getColumnModel().getColumn(checkBoxColumn); tc.setCellRenderer(null); tc.setCellEditor(null); } } public IndexJRadioButton getCheckBox(int i) { return templetRadioButton[tableCheck[i]]; } public boolean isSelected(int i) { return tableCheck[i] == 0 ? false : true; } public int size() { return tableCheck.length; } public void clearCheckBoxList() { createCheckBoxList(); } public void createCheckBoxList() { tableCheck = new byte[0]; selectedIndexMap = new HashMap(); tableCheckedCount = 0; selectLogicRadionButtonChecked(true); } public void resetCheckBox(int size) { createCheckBoxList(); addCheckBoxs(size); selectLogicRadionButtonChecked(true); } public JTable getTable() { return this.table; } { initCheckBox(); } public void initCheckBox() { for (int i = 0; i < templetRadioButton.length; i++) { templetRadioButton[i].setVisible(true); } editorCheckBox.addActionListener(actionChange); editorCheckBox.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (table.getEditingRow() > 0 && table.getEditingRow() < tableCheck.length) { editorCheckBox .setSelected(tableCheck[table.getEditingRow()] == 0 ? false : true); } } }); } public void addCheckBoxs(int size) { tableCheck = new byte[size]; selectedIndexMap.clear(); // addTableMouseListener(); // setColumnAttributes(); } public void setHeaderShowCheckbox(int col) { headerCheckBoxColumn = col; final JTableHeader jh = table.getTableHeader(); TableColumnModel headerColumnMode = jh.getColumnModel(); headerColumnMode.getColumn(0).setHeaderRenderer( new TableHeaderRenderer(getHeaderCheckBox())); jh.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { int column; if ((column = jh.columnAtPoint(e.getPoint())) != -1) { TableColumn tc = table.getColumnModel().getColumn( checkBoxColumn); tc.getCellEditor().cancelCellEditing(); if (column == headerCheckBoxColumn) { selectLogicRadionButtonChecked(true); jh.repaint(); } } } }); } private void selectLogicRadionButtonChecked(boolean seleteSaveTable) { getHeaderCheckBox().setSelected(true); getHeaderCheckBox().setEnabled(false); if (seleteSaveTable) { seletedRadioButtonCheck(); } table.getTableHeader().repaint(); } private void checkedChanged(int index) { if (fireChanged && !table.isEditing()) { changeStata(index); } } private void checkedChanged2(int index) { if (table.isEditing()) { changeStata(index); } } private void changeStata(int index) { if (tableCheck[index] == 1) { tableCheckedCount++; selectedIndexMap.put(index, null); } else { tableCheckedCount--; selectedIndexMap.remove(index); } updateStata(); } private void updateStata() { selectLogicRadionButtonChecked(false); table.getTableHeader().repaint(); } private void selectAllTable(boolean check) { fireChanged = false; byte nowCheckStata = (byte) (check ? 1 : 0); for (int i = 0; i < tableCheck.length; i++) { tableCheck[i] = nowCheckStata; } if (check) { tableCheckedCount = tableCheck.length; } else { tableCheckedCount = 0; } table.revalidate(); table.repaint(); fireChanged = true; } private JRadioButton getHeaderCheckBox() { if (headerRadioButton == null) { headerRadioButton = new JRadioButton(); headerRadioButton.setBorderPainted(true); headerRadioButton.setEnabled(false); headerRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { responseCheckListener(e); } }); } return headerRadioButton; } private void clickCheckBox(int i) { if (tableCheck != null) { tableCheck[i] = (byte) (tableCheck[i] == 0 ? 1 : 0); } } protected class TableHeaderRenderer implements TableCellRenderer { private JRadioButton renderCheckBoxs; public TableHeaderRenderer(JRadioButton tableCheck) { renderCheckBoxs = tableCheck; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return renderCheckBoxs; } } private void seletedRadioButtonCheck() { fireChanged = false; tableCheckedCount = 0; Set keys = selectedIndexMap.keySet(); int checkIndex = 0; for (Iterator keyItr = keys.iterator(); keyItr.hasNext();) { checkIndex = keyItr.next(); if (tableCheck.length > checkIndex) { tableCheck[checkIndex] = 1; tableCheckedCount++; } } if (tableCheckedCount == 0) { selectLogicRadionButtonChecked(true); } else if (tableCheck.length > 0 && tableCheckedCount == tableCheck.length) { selectLogicRadionButtonChecked(false); } table.revalidate(); table.repaint(); fireChanged = true; } public void changeCheckBoxStata(int... stata) { } public void clearAndChangeCheckBoxStata(int... stata) { clearSelect(); changeCheckBoxStata(stata); } public void clearSelect() { selectAllTable(false); getHeaderCheckBox().setSelected(false); getHeaderCheckBox().setEnabled(true); table.revalidate(); table.repaint(); updateStata(); } public void setSelectedCheckIndexs(List selectedInx) { selectedIndexMap = new HashMap(); for (int i = 0; i < selectedInx.size(); i++) { selectedIndexMap.put(selectedInx.get(i), null); } } public TableCellEditor getCheckBoxsCellEditor(boolean addListener) { TableCellEditor tce = new CheckBoxsCellEditor(); if (addListener) tce.addCellEditorListener(new CheckBoxCellEditorListener()); return tce; } public TableCellRenderer getCheckBoxsCellRenderer() { return new CheckBoxsRenderer(); } class CheckBoxsCellEditor extends DefaultCellEditor { /** * */ private static final long serialVersionUID = -1875319868682535006L; public CheckBoxsCellEditor() { super(new JTextField()); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return editorCheckBox; } } protected class CheckBoxsRenderer implements TableCellRenderer { public CheckBoxsRenderer() { } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (row < tableCheck.length) { return (Component) templetRadioButton[tableCheck[row]]; } return null; } } private class IndexJRadioButton extends JRadioButton { public IndexJRadioButton(String text, boolean selected) { super(text, selected); } public IndexJRadioButton() { super("", false); } /** * */ private static final long serialVersionUID = 1L; } public Set getSelectedIndexsSet(){ return getSelectedIndexsSet(tablePanel.getTableModel()); } @Deprecated public Set getSelectedIndexsSet(VCIJTableModel baseTableModel){ Set set = new HashSet(); set = selectedIndexMap.keySet(); return set; } public int[] getSelectedIndexs() { return getSelectedIndexs(tablePanel.getTableModel()); } @Deprecated public int[] getSelectedIndexs(VCIJTableModel baseTableModel) { Set set = getSelectedIndexsSet(baseTableModel); Integer[] ints = new Integer[set.size()]; ints = set.toArray(ints); Arrays.sort(ints); int[] res = new int[ints.length]; for (int i = 0; i < res.length; i++) { res[i] = ints[i].intValue(); } return res; } class CheckBoxCellEditorListener implements CellEditorListener { int row; int col; public void editingStopped(ChangeEvent e) { table.revalidate(); table.repaint(); } public void editingCanceled(ChangeEvent e) { table.revalidate(); table.repaint(); } } public void removeAllSelectedIndex() { selectedIndexMap = new HashMap(); tableCheckedCount = 0; updateStata(); } @SuppressWarnings("rawtypes") public void removeAllSelectedIndexAndCheckBox(VCIJTableModel baseTableModel) { int[] indexs = getSelectedIndexs(baseTableModel); tableCheck = new byte[tableCheck.length - indexs.length]; } public void removeAllSelectedIndexAndCheckBox(Integer[] indexs) { tableCheck = new byte[tableCheck.length - indexs.length]; for (int i = indexs.length - 1; i >= 0; i--) { selectedIndexMap.remove(indexs[i]); } tableCheckedCount = selectedIndexMap.size(); updateStata(); } /** * maxWidth * @return maxWidth */ public int getMaxWidth() { return maxWidth; } /** * maxWidth * @param maxWidth maxWidth */ public void setMaxWidth(int maxWidth) { this.maxWidth = maxWidth; } /** * minWidth * @return minWidth */ public int getMinWidth() { return minWidth; } /** * minWidth * @param minWidth minWidth */ public void setMinWidth(int minWidth) { this.minWidth = minWidth; } /** * preferredWidth * @return preferredWidth */ public int getPreferredWidth() { return preferredWidth; } /** * preferredWidth * @param preferredWidth preferredWidth */ public void setPreferredWidth(int preferredWidth) { this.preferredWidth = preferredWidth; } }