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

解决方案 »

  1.   

    @Override 我觉得可以防止拼写错误。这个不用你调用,其他的某些方法会调用。
      

  2.   

    修改你发的上面的例子结果:package com.han;import java.awt.Color;
    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);
    }
    }
      

  3.   

    然后给你一个提供行标题栏的表格例子,供你参考学习以熟悉JTable的使用:package com.han;import java.awt.BorderLayout;
    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);
    }
    }
      

  4.   

    基本上哪个类不会用在java2s.com上搜索,多数都有示例代码
      

  5.   

    @Override 是一种标注,表示这个方法重写了父亲方法,当一个类有成千行很多方法名比较相近的时候,这个标注就会使你很清楚的看到哪些方法是重写父亲的方法,不至于搞混代码,当然这个标注去掉是没有任何问题的,java编译器是不会搞混的。
    至于那几个方法是在哪里调用的嘛,Jtable里面会保存一个TableModel的实例,当Jtable相应鼠标键盘等事件的时候,它就会调用model里相应的方法,而model里面的有些方法被你重写了,它调用的就是这些你重写过的方法,所以你的代码就被执行了。
    觉得比较有效的学习方法还是看源码,虽然在网上看一些例子可以加快你的学习速度,但自己的理解层面终归太浅,当遇到的问题稍微变了个样子,或者遇到更深层一点的问题自己又没法解决了。
      

  6.   

    请问下,这里并没有设置鼠标或者键盘事件,也没有鼠标键盘操作,可那些方法就已经被调用了。这是为什么的?还有就是,如何看源代码?在java里面,每一个组件都一个ui与之对应,JTable也不例外,那些鼠标键盘事件就是在这个UI类里面系统帮你设置的。
    看源码的话挺简单的,但这里一两句话也说不清,你可以在网上搜一下。