import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Vector;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;public class ExampleFrame_03 extends JFrame { public static void main(String args[]) {
ExampleFrame_03 frame = new ExampleFrame_03();
frame.setVisible(true);
} public ExampleFrame_03() {
super();
setTitle("定义表格");
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER); String[] columnNames = { "A", "B", "C", "D", "E", "F", "G" };
Vector columnNameV = new Vector();
for (int column = 0; column < columnNames.length; column++) {
columnNameV.add(columnNames[column]);
}
Vector tableValueV = new Vector();
for (int row = 1; row < 21; row++) {
Vector rowV = new Vector();
for (int column = 0; column < columnNames.length; column++) {
rowV.add(columnNames[column] + row);
}
tableValueV.add(rowV);
} JTable table = new MTable(tableValueV, columnNameV);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 关闭表格列的自动调整功能
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 选择模式为单选
table.setSelectionBackground(Color.YELLOW);// 被选择行的背景色为黄色
table.setSelectionForeground(Color.RED);// 被选择行的前景色(文字颜色)为红色
table.setRowHeight(30);// 表格的行高为30像素
scrollPane.setViewportView(table);
//
} private class MTable extends JTable {// 实现自己的表格类 public MTable(Vector rowData, Vector columnNames) {
super(rowData, columnNames);
} // 定义表格头
@Override
public JTableHeader getTableHeader() {
JTableHeader tableHeader = super.getTableHeader();// 获得表格头对象
tableHeader.setReorderingAllowed(false);// 设置表格列不可重排
DefaultTableCellRenderer hr = (DefaultTableCellRenderer) tableHeader
.getDefaultRenderer(); // 获得表格头的单元格对象
hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);// 设置列名居中显示
return tableHeader;
} // 定义单元格
@Override
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super
.getDefaultRenderer(columnClass); // 获得表格的单元格对象
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); // 设置单元格内容居中显示
return cr;
} // 表格不可编辑
@Override
public boolean isCellEditable(int row, int column) {
return false;
} }}
第一个问题是@Override的作用,貌似删了也没事?它在java中到底起什么作用的?
特别是第二个问题,私有类MTable中重写了getTableHeader()、getDefaultRenderer(Class<?> columnClass)和isCellEditable(int row, int column)三个方法。可为什么,没有调用这三个方法,三个方法所实现的效果却出来了?java基础知识 JTable类java基础JTable
import java.awt.Color;
import java.util.Vector;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;public class ExampleFrame_03 extends JFrame { public static void main(String args[]) {
ExampleFrame_03 frame = new ExampleFrame_03();
frame.setVisible(true);
} public ExampleFrame_03() {
super();
setTitle("定义表格");
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER); String[] columnNames = { "A", "B", "C", "D", "E", "F", "G" };
Vector columnNameV = new Vector();
for (int column = 0; column < columnNames.length; column++) {
columnNameV.add(columnNames[column]);
}
Vector tableValueV = new Vector();
for (int row = 1; row < 21; row++) {
Vector rowV = new Vector();
for (int column = 0; column < columnNames.length; column++) {
rowV.add(columnNames[column] + row);
}
tableValueV.add(rowV);
} JTable table = new MTable(tableValueV, columnNameV);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 关闭表格列的自动调整功能
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 选择模式为单选
table.setSelectionBackground(Color.YELLOW);// 被选择行的背景色为黄色
table.setSelectionForeground(Color.RED);// 被选择行的前景色(文字颜色)为红色
table.setRowHeight(30);// 表格的行高为30像素
scrollPane.setViewportView(table);
//
} private class MTable extends JTable {// 实现自己的表格类 public MTable(Vector rowData, Vector columnNames) {
super(rowData, columnNames);
} // 定义表格头
@Override
public JTableHeader getTableHeader() {
JTableHeader tableHeader = super.getTableHeader();// 获得表格头对象
tableHeader.setReorderingAllowed(false);// 设置表格列不可重排
DefaultTableCellRenderer hr = (DefaultTableCellRenderer) tableHeader
.getDefaultRenderer(); // 获得表格头的单元格对象
hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);// 设置列名居中显示
return tableHeader;
} // 定义单元格
@Override
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super
.getDefaultRenderer(columnClass); // 获得表格的单元格对象
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); // 设置单元格内容居中显示
return cr;
} // 表格不可编辑
@Override
public boolean isCellEditable(int row, int column) {
return false;
} }}
第一个问题是@Override的作用,貌似删了也没事?它在java中到底起什么作用的?
特别是第二个问题,私有类MTable中重写了getTableHeader()、getDefaultRenderer(Class<?> columnClass)和isCellEditable(int row, int column)三个方法。可为什么,没有调用这三个方法,三个方法所实现的效果却出来了?java基础知识 JTable类java基础JTable
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;public class JTable3 extends JFrame {
private static final long serialVersionUID = -8022000459941822250L; public JTable3() {
super();
setTitle("定义表格");
setBounds(100, 100, 500, 375);
setLayout(new GridLayout(3, 1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane);
String[] columnNames = { "A", "B", "C", "D", "E", "F" };
Vector<String> columnNameV = new Vector<>();
for (int column = 0; column < columnNames.length; column++) {
columnNameV.add(columnNames[column]);
}
Vector<Vector<String>> tableValueV = new Vector<>();
for (int row = 1; row < 21; row++) {
Vector<String> rowV = new Vector<>();
for (int column = 0; column < columnNames.length; column++) {
rowV.add(columnNames[column] + row);
}
tableValueV.add(rowV);
}
final DefaultTableModel tableModel = new DefaultTableModel(tableValueV,
columnNameV);
final JTable table = new MTable(tableModel);
table.setRowSorter(new TableRowSorter<>(tableModel));
scrollPane.setViewportView(table);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
TableColumnModel tableColumnModel = table.getColumnModel();
ListSelectionModel listSelectionModel = tableColumnModel
.getSelectionModel();
System.out.println(listSelectionModel.getSelectionMode());
listSelectionModel
.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
System.out.println(table.getColumnSelectionAllowed());
System.out.println(table.getRowSelectionAllowed());
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
table.setBackground(Color.YELLOW);
table.setForeground(Color.RED);
table.setRowHeight(30); // in pixels /* manipulate the table */
table.setRowSelectionInterval(1, 3);
table.setColumnSelectionInterval(1, 1);
table.addRowSelectionInterval(4, 5);// must consider the selection mode
// that has been set before
JPanel buttonPanel = new JPanel();
getContentPane().add(buttonPanel);
JButton selectAllButton = new JButton("全部选择");
selectAllButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
table.selectAll();
}
});
buttonPanel.add(selectAllButton);
JButton clearSelectionButton = new JButton("取消选择");
clearSelectionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
table.clearSelection();
}
});
buttonPanel.add(clearSelectionButton);
System.out.println("表格共有" + table.getRowCount() + "行"
+ table.getColumnCount() + "列");
System.out.println("共有" + table.getSelectedRowCount() + "行被选中");
System.out.println("第1行的选择状态是: " + table.isRowSelected(0));
System.out.println("第3行的选择状态是: " + table.isRowSelected(2));
System.out.println("被选中的第一行索引是: " + table.getSelectedRow());
int[] selectedRows = table.getSelectedRows();
System.out.print("所有被选中的行的索引是: ");
for (int row = 0; row < selectedRows.length; row++) {
System.out.print(selectedRows[row] + "\t");
}
System.out.println();
System.out.println("移动前第2列的名称是: " + table.getColumnName(1));
System.out.println("移动前第2行第2列的值是: " + table.getValueAt(1, 1));
table.moveColumn(1, 3);
System.out.println("移动后第2列的名称是: " + table.getColumnName(1));
System.out.println("移动后第2行第2列的值是: " + table.getValueAt(1, 1)); /* 维护表格模型 */
JPanel panelModel = new JPanel();
panelModel.add(new JLabel("A: "));
final JTextField aTextField = new JTextField("A4", 10);
panelModel.add(aTextField);
panelModel.add(new JLabel("B: "));
final JTextField bTextField = new JTextField("B4", 10);
panelModel.add(bTextField);
JButton addButton = new JButton("添加");
panelModel.add(addButton);
JButton updButton = new JButton("修改");
panelModel.add(updButton);
JButton delButton = new JButton("删除");
panelModel.add(delButton);
getContentPane().add(panelModel);
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int selectedRow = table.getSelectedRow();
selectedRow = table.convertRowIndexToModel(selectedRow);// because
// there
// exists
// sorting
Object oa = tableModel.getValueAt(selectedRow, 0);
Object ob = tableModel.getValueAt(selectedRow, 1);
aTextField.setText(oa.toString());
bTextField.setText(ob.toString());
}
});
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String[] rowValues = { aTextField.getText(),
bTextField.getText() };
tableModel.addRow(rowValues);
}
});
updButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selectedRow = table.getSelectedRow();
selectedRow = table.convertRowIndexToModel(selectedRow);
if (selectedRow != -1) {
tableModel.setValueAt(aTextField.getText(), selectedRow, 0);
tableModel.setValueAt(bTextField.getText(), selectedRow, 1);
}
}
});
delButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selectedRow = table.getSelectedRow();
selectedRow = table.convertRowIndexToModel(selectedRow);
if (selectedRow != -1) {
tableModel.removeRow(selectedRow);
}
}
}); // **************************************************************
// This is a standard snippet to realize the desired column selection as
// in Excel
// ************************************************************** // row selection mode
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// column selection mode
// TableColumnModel tableColumnModel = table.getColumnModel();
tableColumnModel.getSelectionModel().setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// allow the column selection (the row selection is allowed by default)
table.setColumnSelectionAllowed(true);
final JTableHeader tableHeader = table.getTableHeader();
tableHeader.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// Extended modifiers represent the state of all modal keys,
// such as ALT, CTRL, META.
if (e.getClickCount() == 1
&& e.getButton() == MouseEvent.BUTTON1) {
// Point point = new Point(e.getX(), e.getY());
Point point = new Point(e.getPoint());
int columnNum = tableHeader.columnAtPoint(point);
// System.out.println(columnNum);
int[] selectedColumns = table.getSelectedColumns();
if (selectedColumns.length != 0) {
// System.out.println("here1");
// System.out.println(InputEvent.getModifiersExText(e.getModifiersEx()));
if (e.getModifiersEx() == (InputEvent.CTRL_DOWN_MASK)) {
System.out.println("ctrl");
if (Arrays.binarySearch(selectedColumns, columnNum) >= 0) {
table.removeColumnSelectionInterval(columnNum,
columnNum);
} else {
table.addColumnSelectionInterval(columnNum,
columnNum);
}
} else if (e.getModifiersEx() == (InputEvent.SHIFT_DOWN_MASK)) {
// System.out.println("shift");
table.setColumnSelectionInterval(
selectedColumns[0], columnNum);
} else {
table.setColumnSelectionInterval(columnNum,
columnNum);
}
} else {
// System.out.println("here2");
table.setColumnSelectionInterval(columnNum, columnNum);
}
table.setRowSelectionInterval(0, table.getRowCount() - 1);
}
}
});
} private class MTable extends JTable {
private static final long serialVersionUID = -3934300578737290495L; public MTable(TableModel tableModel) {
super(tableModel);
} @Override
public JTableHeader getTableHeader() {
JTableHeader tableHeader = super.getTableHeader();
tableHeader.setReorderingAllowed(false);
DefaultTableCellRenderer tableCellRenderer = (DefaultTableCellRenderer) tableHeader
.getDefaultRenderer();
tableCellRenderer
.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return tableHeader;
} @Override
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super
.getDefaultRenderer(columnClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
} @Override
public boolean isCellEditable(int row, int column) {
return false;
}
} public static void main(String[] args) {
JTable3 frame = new JTable3();
frame.setVisible(true);
}
}
import java.util.Vector;import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;/**
* <pre>
* public boolean isCellEditable(int row, int column) {
* return getModel().isCellEditable(convertRowIndexToModel(row),
* convertColumnIndexToModel(column));
* }
* </pre>
*
* so we can also directly rewrite the isCellEditable() in the table model.
*
* @author HAN
*
*/
public class MFixedColumnTable_Modified extends JPanel {
private static final long serialVersionUID = -8001758880985479654L;
private Vector<String> columnNameV; // declare the table column name vector
private Vector<Vector<Object>> tableValueV;
private int fixedColumn = 1; // the fixed column number
private JTable fixedColumnTable;
private FixedColumnTableModel fixedColumnTableModel;
private JTable floatingColumnTable;
private FloatingColumnTableModel floatingColumnTableModel; private class FixedColumnTableModel extends AbstractTableModel {
private static final long serialVersionUID = 3935656415101599023L; @Override
public int getRowCount() {
return tableValueV.size();
} @Override
public int getColumnCount() {
return fixedColumn;
} @Override
public Object getValueAt(int rowIndex, int columnIndex) {
return tableValueV.get(rowIndex).get(columnIndex);
} @Override
public String getColumnName(int columnIndex) {
return columnNameV.get(columnIndex);
}
} private class FloatingColumnTableModel extends AbstractTableModel {
private static final long serialVersionUID = -2481466672947191281L;
@Override
public boolean isCellEditable(int row, int column) {
return true;
} @Override
public int getRowCount() {
return tableValueV.size();
} @Override
public int getColumnCount() {
return columnNameV.size() - fixedColumn;
} @Override
public Object getValueAt(int rowIndex, int columnIndex) {
return tableValueV.get(rowIndex).get(columnIndex + fixedColumn);
} @Override
public String getColumnName(int columnIndex) {
return columnNameV.get(columnIndex + fixedColumn);
}
} private class MListSelectionListener implements ListSelectionListener {
boolean isFixedColumnTable = true; public MListSelectionListener(boolean isFixedColumnTable) {
this.isFixedColumnTable = isFixedColumnTable;
} @Override
public void valueChanged(ListSelectionEvent e) {
if (isFixedColumnTable) {
int row = fixedColumnTable.getSelectedRow();
floatingColumnTable.setRowSelectionInterval(row, row);
} else {
int row = floatingColumnTable.getSelectedRow();
fixedColumnTable.setRowSelectionInterval(row, row);
}
}
} public MFixedColumnTable_Modified(Vector<String> columnNameV,
Vector<Vector<Object>> tableValueV, int fixedColumn) {
super();
setLayout(new BorderLayout());
this.columnNameV = columnNameV;
this.tableValueV = tableValueV;
this.fixedColumn = fixedColumn;
// create fixedColumnTable
fixedColumnTableModel = new FixedColumnTableModel();
fixedColumnTable = new JTable(fixedColumnTableModel);
ListSelectionModel fixed = fixedColumnTable.getSelectionModel();
fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixed.addListSelectionListener(new MListSelectionListener(true));
// create floatingColumnTable
floatingColumnTableModel = new FloatingColumnTableModel();
floatingColumnTable = new JTable(floatingColumnTableModel);
floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
ListSelectionModel floating = floatingColumnTable.getSelectionModel();
floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
floating.addListSelectionListener(new MListSelectionListener(false));
// create scrollPane
JScrollPane scrollPane = new JScrollPane();
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
fixedColumnTable.getTableHeader());
JViewport viewport = new JViewport();
viewport.setView(fixedColumnTable);
viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
scrollPane.setRowHeaderView(viewport); // viewport 视口
scrollPane.setViewportView(floatingColumnTable);
add(scrollPane, BorderLayout.CENTER);
}
}
package com.han;import java.awt.BorderLayout;
import java.util.Vector;import javax.swing.JFrame;/**
* Provide a fixed column in a table.
*
* <code><p>public boolean isCellEditable(int row, int column) {<p>
return getModel().isCellEditable(convertRowIndexToModel(row),<p>
convertColumnIndexToModel(column));<p>
}<p>
</code> so we can also directly rewrite the isCellEditable() in the table
* model.
*
* @author Gaowen
*
*/
public class JTable4_Modified extends JFrame {
private static final long serialVersionUID = 805308369080023303L; public JTable4_Modified() {
super();
setTitle("提供行标题栏的表格");
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Vector<String> columnNameV = new Vector<>();
columnNameV.add("日期");
for (int i = 1; i < 21; i++) {
columnNameV.add("商品" + i);
}
Vector<Vector<Object>> tableValueV = new Vector<>();
for (int row = 1; row < 31; row++) {
Vector<Object> rowV = new Vector<>();
rowV.add(row);
for (int col = 0; col < 20; col++) {
rowV.add((int) (Math.random() * 1000));
}
tableValueV.add(rowV);
}
final MFixedColumnTable_Modified panel = new MFixedColumnTable_Modified(
columnNameV, tableValueV, 1);
getContentPane().add(panel, BorderLayout.CENTER);
} public static void main(String[] args) {
JTable4_Modified frame = new JTable4_Modified();
frame.setVisible(true);
}
}
至于那几个方法是在哪里调用的嘛,Jtable里面会保存一个TableModel的实例,当Jtable相应鼠标键盘等事件的时候,它就会调用model里相应的方法,而model里面的有些方法被你重写了,它调用的就是这些你重写过的方法,所以你的代码就被执行了。
觉得比较有效的学习方法还是看源码,虽然在网上看一些例子可以加快你的学习速度,但自己的理解层面终归太浅,当遇到的问题稍微变了个样子,或者遇到更深层一点的问题自己又没法解决了。
看源码的话挺简单的,但这里一两句话也说不清,你可以在网上搜一下。