import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.Enumeration; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.RowSorter; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class MyStyleTable extends JTable { private String[] color = null; private String[] header= new String[]{"NO", "Incurred Date", "Clinic", "Doctor", "Sequence", "Service Code", "Drug Code", "Description", "Amount", "Voucher No.", "Diagnosis 1", "Diag Desc 1", "Diagnosis 2", "Diag Desc 2", "Diagnosis 3", "Diag Desc 3", "Patient Name", "Staff No.", "Member Code", "Role"}; private TableModel model; public MyStyleTable() { super(); } public MyStyleTable(Object[][] rowData){ //add mouse event for table this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { try { // TODO add your handling code here: String cmd = "cmd /c start " + System.getProperty("user.dir") + "/pdf/" + MyStyleTable.this.getModel().getValueAt(MyStyleTable.this.getSelectedRow(), 9).toString() + ".tif"; Runtime.getRuntime().exec(cmd); } catch (IOException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); } } } }); this.init(rowData); } //fix table column width public void setFixColumnWidth(JTable table){ //this.setRowHeight(30); this.setAutoResizeMode(table.AUTO_RESIZE_OFF); /**/ //The following code can be used to fix table column width TableColumnModel tcm = table.getTableHeader().getColumnModel(); for (int i = 0; i < tcm.getColumnCount(); i++) { TableColumn tc = tcm.getColumn(i); tc.setPreferredWidth(50); // tc.setMinWidth(100); tc.setMaxWidth(50); } } //update model for table public void init(Object[][] rowData) { if(rowData!=null){ this.setRowSelectionAllowed(true); this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.setColumnSelectionAllowed(false); this.getTableHeader().setForeground(Color.BLUE); model = new DefaultTableModel(rowData, header) { public Class getColumnClass(int column) { Class returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0, column).getClass(); } else { returnValue = Object.class; } return returnValue; } @Override public boolean isCellEditable(int row, int column) { return false; } }; this.setModel(model); //resort data by clicking table header RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); this.setRowSorter(sorter); //set row background color this.paintRow(); this.setIntercellSpacing(new Dimension(5,5)); //resize column width accordng to content of cell automatically fitTableColumns(this); } } /** * 根据color数组中相应字符串所表示的颜色来设置某行的颜色,注意,JTable中可以对列进行整体操作 * 而无法对行进行整体操作,故设置行颜色实际上是逐列地设置该行所有单元格的颜色。 */ public void paintRow() { TableColumnModel tcm = this.getColumnModel(); for (int i = 0, n = tcm.getColumnCount(); i < n; i++) { TableColumn tc = tcm.getColumn(i); tc.setCellRenderer(new RowRenderer()); } } public void paintColorRow() { TableColumnModel tcm = this.getColumnModel(); for (int i = 0, n = tcm.getColumnCount(); i < n; i++) { TableColumn tc = tcm.getColumn(i); tc.setCellRenderer(new RowColorRenderer()); } } //resize column width automatically public void fitTableColumns(JTable myTable) { myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JTableHeader header = myTable.getTableHeader(); int rowCount = myTable.getRowCount(); Enumeration columns = myTable.getColumnModel().getColumns(); while(columns.hasMoreElements()) { TableColumn column = (TableColumn)columns.nextElement(); int col = header.getColumnModel().getColumnIndex(column.getIdentifier()); int width = (int)myTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(myTable, column.getIdentifier (), false, false, -1, col).getPreferredSize().getWidth(); for(int row = 0; row<rowCount; row++) { int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent(myTable, myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth(); width = Math.max(width, preferedWidth); } header.setResizingColumn(column); // 此行很重要 column.setWidth(width+myTable.getIntercellSpacing().width); } } /** *单元格可以为多行模式,自动换行,奇偶行背景色交替 */ private class RowRenderer extends JTextArea implements TableCellRenderer { public RowRenderer() { //multiple line mode // setLineWrap(true); // setWrapStyleWord(true); } public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column) { //设置奇偶行的背景色,可在此根据需要进行修改 if (row % 2 == 0) { setBackground(Color.getHSBColor(63, 11, 91)); } else { setBackground(Color.getHSBColor(214, 14, 98)); } int maxPreferredHeight = 0; for (int i = 0; i < t.getColumnCount(); i++) { setText("" + t.getValueAt(row, i)); setSize(t.getColumnModel().getColumn(column).getWidth(), 0); maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); } if (t.getRowHeight(row) != maxPreferredHeight) { t.setRowHeight(row, maxPreferredHeight); } setText((value == null || "null".equals(value)) ? "" : value.toString()); return this; } } /** * 多行颜色交替 * */ private class RowColorRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column) { //分支判断条件可根据需要进行修改 if (color[row].trim().equals("R")) { setBackground(Color.RED); } else if (color[row].trim().equals("C")) { setBackground(Color.CYAN); } else if (color[row].trim().equals("B")) { setBackground(Color.BLUE); } else if (color[row].trim().equals("O")) { setBackground(Color.ORANGE); } else { setBackground(Color.WHITE); } return super.getTableCellRendererComponent(t, value, isSelected, hasFocus, row, column); } } } |