import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; final public class TableDemo extends JFrame { private static final long serialVersionUID = 1L; private JButton increaseHeightButton, reduceHeightButton, addRowButton, deleteRowButton; private LineNumberTablePane tablePane; private JTable primaryTable = new JTable(), numberTable = new JTable(); public TableDemo() throws HeadlessException { super("line number table"); initButton(); // buildPrimaryTable(); tablePane = new LineNumberTablePane(primaryTable, numberTable); buildPrimaryTable(); doLay(); // tablePane.refershRowHeader(); } private void buildPrimaryTable() { String[][] datas = new String[][] { { "老张", "28", "56.2" }, { "小杨", "30", "56.2" }, { "大李", "33", "56.2" }, { "胖刘", "35", "156.2" } }; String[] columnNames = new String[] { "姓名", "年龄", "体重" }; primaryTable.setModel(new DefaultTableModel(datas, columnNames)); tablePane.notifyRowsChanged(); } private void initButton() { increaseHeightButton = new JButton("increase row height"); increaseHeightButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int old = primaryTable.getRowHeight(); primaryTable.setRowHeight(old + 5); } }); reduceHeightButton = new JButton("reduce row height"); reduceHeightButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int old = primaryTable.getRowHeight(); primaryTable.setRowHeight(old - 5); } }); addRowButton = new JButton("add row"); addRowButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DefaultTableModel dm = (DefaultTableModel) primaryTable .getModel(); String[] insertedRowData = new String[] { "无名氏", "X", "Y" }; dm.insertRow(0, insertedRowData); tablePane.notifyRowsChanged(); tablePane.scrollRowToVisible(10); } }); deleteRowButton = new JButton("delete Row"); deleteRowButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DefaultTableModel dm = (DefaultTableModel) primaryTable .getModel(); dm.removeRow(0); tablePane.notifyRowsChanged(); tablePane.scrollRowToVisible(10); } }); } private void doLay() { Container container = getContentPane(); JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); buttonsPane.add(increaseHeightButton); buttonsPane.add(reduceHeightButton); buttonsPane.add(addRowButton); buttonsPane.add(deleteRowButton); container.add(buttonsPane, BorderLayout.NORTH); container.add(tablePane, BorderLayout.CENTER); setSize(470, 200); setVisible(true); } public static void main(String[] args) { new TableDemo(); } }
import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.beans.*; //为Table添加行号 final public class LineNumberTablePane extends JScrollPane { private static final long serialVersionUID = 1L; private JTable primaryTable = new JTable(); private JTable numberTable = new JTable(); private static final int DEFAULT_MIN_ROW_HEADER_WIDTH = 30; private static final String ROW_HEADER_IDENTIFIER = "lineNumberColumn"; private static final String ROW_HEADER_COLUMN_NAME = "lineNumberRowColumn"; private static final String ROW_HEADER_VALUE = "行号"; private TableColumn rowHeaderColumn = new TableColumn(0); private DefaultTableModel rowHeaderTableModel = new NumberTableModel(); public LineNumberTablePane(final JTable primaryTableComponent, final JTable numberTableComponent) { super(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); primaryTable = primaryTableComponent; numberTable = numberTableComponent; numberTable.setModel(rowHeaderTableModel); numberTable.setColumnModel(new NumberTableColumnModel()); checkPropertyListeners(); notifyRowsChanged(); } public void notifyRowsChanged() { while (rowHeaderTableModel.getRowCount() > 0) rowHeaderTableModel.removeRow(0); for (int i = 0, j = primaryTable.getRowCount(); i < j; i++) { rowHeaderTableModel.addRow(new Integer[] { i + 1 }); } adjustRowHeaderHeight(); } private void adjustRowHeaderHeight() { setViewportView(primaryTable); setRowHeaderView(numberTable); int h = this.getVerticalScrollBar().getSize().height; getRowHeader().setPreferredSize( new Dimension(DEFAULT_MIN_ROW_HEADER_WIDTH, h)); } private void checkPropertyListeners() { primaryTable.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("rowHeight")) { Integer h = (Integer) evt.getNewValue(); numberTable.setRowHeight(h); adjustRowHeaderHeight(); } } }); } public void scrollRowToVisible(int row) { int rowMargin = primaryTable.getRowMargin(); int y = 0, w = 0; for (int i = 0; i < row; i++) y += primaryTable.getRowHeight(i) + rowMargin; TableColumnModel columnModel = primaryTable.getColumnModel(); for (int i = 0, j = columnModel.getColumnCount(); i < j; i++) w += columnModel.getColumn(i).getWidth(); primaryTable.scrollRectToVisible(new Rectangle(0, y, w, primaryTable .getRowHeight(row))); } public JTable getPrimaryTable() { return primaryTable; } public JTable getRowHeaderTable() { return numberTable; } private class NumberTableModel extends DefaultTableModel { private static final long serialVersionUID = 1L; public int getColumnCount() { return 1; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public Object getValueAt(int rowIndex, int columnIndex) { return columnIndex == 0 ? rowIndex + 1 : null; } public String getColumnName(int column) { return column == 0 ? ROW_HEADER_COLUMN_NAME : ""; } public Class<?> getColumnClass(int columnIndex) { return columnIndex == 0 ? Integer.class : null; } } private class NumberTableColumnModel extends DefaultTableColumnModel { private static final long serialVersionUID = 1L; private NumberTableColumnModel() { rowHeaderColumn.setIdentifier(ROW_HEADER_IDENTIFIER); rowHeaderColumn.setHeaderValue(ROW_HEADER_VALUE); TableCellRenderer renderer = new RowHeaderCellRenderer(); rowHeaderColumn.setCellRenderer(renderer); rowHeaderColumn.setHeaderRenderer(renderer); addColumn(rowHeaderColumn); } public int getColumnCount() { return 1; } } private class RowHeaderCellRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel label = new JLabel() { private static final long serialVersionUID = 1L; public Insets getInsets() { return new Insets(0, 0, 0, 0); } }; label.setHorizontalAlignment(SwingConstants.RIGHT); if (column == 0) { label.setText(value.toString()); label.setOpaque(true); label.setBackground(Color.BLACK); label.setForeground(Color.YELLOW); } return label; } } }