📄 catalogtable.java
字号:
package org.trinet.util.graphics.table;
import org.trinet.jasi.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.Arrays;
import org.trinet.util.*;
public class CatalogTable {
private JTable tableRowHead;
private JTable tableView;
private CatalogTableModel tableModel;
private TableSorterAbs sorter;
private JScrollPane tableDB;
private Font font;
private int fontSize = 12;
private final static String [] DEFAULT_NAME_ORDER = CatalogTableConstants.columnNames;
private String [] columnNameOrder = DEFAULT_NAME_ORDER;
public final void setColumnNameOrder(String [] names) {
if (names != null) columnNameOrder = names;
}
public final String [] getColumnNameOrder() {
return columnNameOrder;
}
static final int MAX_FRACTION_ELEMENTS=16;
static final int COLUMN_WIDTH_PADDING=2;
// Table constructor
public CatalogTable(CatalogTableModel tm) {
this.tableModel = tm;
}
public String [] getTableColumnHeaders() {
if (tableView == null) return null;
int count = tableView.getColumnCount();
if (count < 1) return null;
String [] headers = new String[count];
TableColumnModel tcm = tableView.getColumnModel();
for (int i = 0; i < count; i++) {
headers[i] = (String) tcm.getColumn(i).getHeaderValue();
}
return headers;
}
public int getSortedRowModelIndex(int selectedRow) {
return sorter.indexes[selectedRow];
}
public TableSorterAbs getSortedModel() {
return sorter;
}
public CatalogTableModel getModel() {
return this.tableModel;
}
public JTable getRowHeader() {
return tableRowHead;
}
public JTable getTable() {
return tableView;
}
private final class TableHeaderRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
}
setText((value == null) ? "" : value.toString());
// setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
setHorizontalAlignment(JLabel.CENTER);
return this;
}
}
// Implementation of Listener interface
public class EditorMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent evt) {
if ( evt.getModifiers() == MouseEvent.BUTTON3_MASK && evt.getClickCount() == 2) {
// Debug.println("CatalogTable: EML Canceling edit");
tableView.editingCanceled(new ChangeEvent(tableView));
tableView.repaint();
}
else if ( evt.getModifiers() == MouseEvent.BUTTON2_MASK && evt.getClickCount() == 2) {
// Debug.println("CatalogTable: EML Stopping edit");
tableView.editingStopped(new ChangeEvent(tableView));
// tableView.repaint();
}
}
}
class TableEditListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
/*
Object obj = e.getSource();
// Debug.println("CatalogTable: TableEditListener Source: " + e.getSource() );
Component [] cmps = tableView.getComponents();
for (int i = 0; i<cmps.length; i++) {
// Debug.println(cmps[i].getClass().getName());
Component [] cmps2 = ((CellRendererPane)cmps[i]).getComponents();
for (int j = 0; j<cmps2.length; j++) {
// Debug.println(cmps2[i].getClass().getName());
}
}
*/
// if (tableView.isEditing()) tableView.editingCanceled(new ChangeEvent(tableView));
if (tableView.isEditing()) tableView.editingStopped(new ChangeEvent(tableView));
}
}
class TableRowHeadSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
if (tableRowHead.getSelectedRowCount() <= 0) return;
int [] rows = tableRowHead.getSelectedRows();
tableView.clearSelection();
for (int index=0; index<rows.length; index++) {
tableView.addRowSelectionInterval(rows[index], rows[index]);
}
}
}
class TableViewSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
if (tableView.getSelectedRowCount() <= 0) return;
int irow = tableView.getSelectedRow();
int irow2 = tableRowHead.getSelectedRow(); // need to check for equivalence else race ValueChanged event loop.
if (irow != irow2 && irow >= 0) {
tableRowHead.clearSelection();
tableRowHead.setRowSelectionInterval(irow, irow);
}
}
}
public JScrollPane createTable(AbstractTableModel tableModel) {
this.tableModel = (CatalogTableModel) tableModel;
return createTable();
}
public JScrollPane createTable() {
// Debug.println("CatalogTable setting up MainTable JTable scrollpane ...");
sorter = new TableSorterAbs();
sorter.setModel(tableModel);
tableView = new JTable(sorter);
if (font == null) font = new Font("Monospaced", Font.PLAIN, fontSize);
tableView.setFont(font);
tableView.setShowGrid(true);
tableView.setAutoResizeMode(tableView.AUTO_RESIZE_OFF );
// tableView.setToolTipText("double-click edits data field only if SELECT FOR UPDATE query");
// tableView.sizeColumnsToFit(tableView.AUTO_RESIZE_NEXT_COLUMN );
// tableView.getTableHeader().setUpdateTableInRealTime(false);
tableView.getTableHeader().setForeground(Color.red);
tableView.getTableHeader().setBackground(new Color(.85f,.85f,.85f));
tableView.getTableHeader().setToolTipText("dbl-click sort ascend; shift-dbl-click sort descend");
tableView.getTableHeader().setFont(font);
// JScrollPane scrollpane = new JScrollPane(tableView);
// Make second table for row header
// Debug.println("CatalogTable setting up RowHeader JTable scrollpane ...");
TableColumnModel tcm = tableView.getColumnModel();
TableColumnModel tcm2 = new DefaultTableColumnModel();
int nkeyCols = 0;
TableColumn col;
int maxCol = tableModel.getColumnCount();
for (int i = 0; i < maxCol; i++) {
if (tableModel.isKeyColumn(i)) {
col = tcm.getColumn(tcm.getColumnIndex((Object) tableModel.getColumnName(i)));
tcm.removeColumn(col);
tcm2.addColumn(col);
nkeyCols++;
}
// test of limited column view AWW 11/99
if (tableModel.isColumnHidden(i))
tcm.removeColumn(tcm.getColumn(tcm.getColumnIndex((Object) tableModel.getColumnName(i))));
}
tcm.moveColumn(tcm.getColumnIndex((Object) "MAG"), 4);
//
// test to change column order here?
TableColumnModel tcmTmp = new DefaultTableColumnModel();
maxCol = columnNameOrder.length;
for (int i = 0; i < maxCol; i++) {
String colName = columnNameOrder[i];
try {
tcmTmp.addColumn(tableView.getColumn(colName));
}
catch (IllegalArgumentException ex) {
System.out.println("Check column order by name - No such table column name:" + colName);
}
}
tableView.setColumnModel(tcmTmp);
tcm = tcmTmp;
// end of test
tableRowHead = new JTable(sorter);
tableRowHead.setColumnModel(tcm2);
tableRowHead.setFont(font);
tableRowHead.setShowGrid(true);
tableRowHead.setAutoResizeMode( tableRowHead.AUTO_RESIZE_OFF );
// tableRowHead.sizeColumnsToFit(tableRowHead.AUTO_RESIZE_NEXT_COLUMN );
// tableRowHead.getTableHeader().setUpdateTableInRealTime(false);
tableRowHead.getTableHeader().setForeground(Color.red);
tableRowHead.getTableHeader().setBackground(new Color(.85f,.85f,.85f));
tableRowHead.getTableHeader().setFont(font);
tableRowHead.getTableHeader().setToolTipText("dbl-click sort ascend; shift-dbl-click sort descend");
// Setup format patterns and number renderers
FormattedNumberRenderer [] numberRenderer = new FormattedNumberRenderer [MAX_FRACTION_ELEMENTS];
FormattedNumberEditor_FW [] numberEditor = new FormattedNumberEditor_FW [MAX_FRACTION_ELEMENTS];
String pattern; // format pattern buffer
String pattern9 = "#0.000000"; // generic four byte float
FormattedNumberRenderer numberRenderer9 = new FormattedNumberRenderer(pattern9);
FormattedNumberEditor_FW numberEditor9 = new FormattedNumberEditor_FW(pattern9);
numberEditor9.getComponent().addMouseListener(new EditorMouseListener());
// Assign editor/renderers to table columns
// comment out for rendering test aww
for (int i = 0; i<tableView.getColumnCount(); i++) {
TableColumn tc = tcm.getColumn(i);
tc.setHeaderRenderer(new TableHeaderRenderer());
Class tmpclass = tableView.getColumnClass(i);
// Debug.println("CatalogTable tableView getColumnClass (i)" + i + " " + tmpclass.getName());
if (tmpclass.getName().indexOf("String") >= 0) {
tc.setCellRenderer(new TextCellRenderer(font));
TextCellEditor textEditor = new TextCellEditor(font);
textEditor.getComponent().addMouseListener(new EditorMouseListener());
tc.setCellEditor(textEditor);
}
else if (tmpclass.getName().indexOf("Double") >= 0) {
int indexViewToModel = tableView.convertColumnIndexToModel(i);
int fractionWidth = tableModel.getColumnFractionDigits(indexViewToModel);
if (fractionWidth >= 0) {
if (fractionWidth > MAX_FRACTION_ELEMENTS - 1 ) fractionWidth = MAX_FRACTION_ELEMENTS - 1;
pattern = getNumberFormatPattern(fractionWidth);
if (numberRenderer[fractionWidth] == null)
numberRenderer[fractionWidth] = new FormattedNumberRenderer(pattern);
if (numberEditor[fractionWidth] == null) {
numberEditor[fractionWidth] = new FormattedNumberEditor_FW(pattern);
numberEditor[fractionWidth].getComponent().addMouseListener(new EditorMouseListener());
}
tc.setCellEditor(numberEditor[fractionWidth]);
tc.setCellRenderer(numberRenderer[fractionWidth]);
}
else if (fractionWidth < 0 ) {
tc.setCellEditor(numberEditor9);
tc.setCellRenderer(numberRenderer9);
}
}
else if (tmpclass.getName().indexOf("Long") >= 0 || tmpclass.getName().indexOf("Integer") >= 0 ||
tmpclass.getName().indexOf("Number") >= 0 ) {
pattern = getNumberFormatPattern(0);
if (numberRenderer[0] == null) numberRenderer[0] = new FormattedNumberRenderer(pattern);
if (numberEditor[0] == null) {
numberEditor[0] = new FormattedNumberEditor_FW(pattern);
numberEditor[0].getComponent().addMouseListener(new EditorMouseListener());
}
tc.setCellEditor(numberEditor[0]);
tc.setCellRenderer(numberRenderer[0]);
}
}
CalendarDateRenderer cdRenderer = new CalendarDateRenderer();
cdRenderer.setHorizontalAlignment(JLabel.LEFT);
tableView.setDefaultRenderer(java.sql.Date.class, cdRenderer);
DateTimeEditor dtEditor = new DateTimeEditor(font);
dtEditor.getComponent().addMouseListener(new EditorMouseListener());
DateTimeRenderer dtRenderer = new DateTimeRenderer();
dtRenderer.setHorizontalAlignment(JLabel.LEFT);
for (int i = 0; i<tableView.getColumnCount(); i++) {
// Debug.println("CatalogTable tableView getColumnName (i)" + i + " " + tableView.getColumnName(i));
if (tableView.getColumnName(i).equalsIgnoreCase("datetime")) {
TableColumn tc = tcm.getColumn(i);
tc.setCellRenderer(dtRenderer);
tc.setCellEditor(dtEditor);
}
}
//comment out for test of rendering
// size scrollable main table columns
// Debug.println("CatalogTable sizing MainTable columns");
initColumnSizes(tableView);
// setup main table selection/color attributes
tableView.setCellSelectionEnabled(false);
tableView.setRowSelectionAllowed(true);
tableView.setColumnSelectionAllowed(false);
tableView.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
tableView.setForeground(Color.black);
tableView.setBackground(new Color(1.f,1.f,0.7f));
tableView.setSelectionForeground(Color.red);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -