packagecom.han;
importjava.awt.BorderLayout;
importjava.awt.Container;
importjava.awt.Point;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.InputEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.util.Arrays;
importjava.util.Vector;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.JTextField;
importjavax.swing.ListSelectionModel;
importjavax.swing.event.TableModelEvent;
importjavax.swing.event.TableModelListener;
importjavax.swing.table.DefaultTableModel;
importjavax.swing.table.JTableHeader;
importjavax.swing.table.TableColumnModel;
/**
* 表格模型事件示例
*
*
A component generally gains the focus when the user clicks it,* or when the user tabs between components, or otherwise interacts
* with a component. A component can also be given the focus programmatically,
* such as when its containing frame or dialog-box is made visible.
* The snippet of the codes below shows how to give a particular component
* the focus every time the window gains the focus.
*
* @author HAN
*
*/
publicclassTableModelEvent_1extendsJFrame {
/**
*
*/
privatestaticfinallongserialVersionUID = -8581492063632813033L;
publicTableModelEvent_1() {
// TODO Auto-generated constructor stub
finalContainer container = getContentPane();
Vector tableColumnNames =newVector();
tableColumnNames.add("A");
tableColumnNames.add("B");
Vector> tableValues =newVector>();
for(inti =1; i <5; i++) {
Vector vector =newVector();
vector.add("A"+ i);
vector.add("B"+ i);
tableValues.add(vector);
}
finalDefaultTableModel defaultTableModel =newDefaultTableModel(
tableValues, tableColumnNames);
finalJTable table =newJTable(defaultTableModel);
JScrollPane scrollPane =newJScrollPane();
scrollPane.setViewportView(table);
container.add(scrollPane, BorderLayout.CENTER);
JPanel panel =newJPanel();
container.add(panel, BorderLayout.SOUTH);
JLabel labelA =newJLabel("A: ");
finalJTextField textFieldA =newJTextField(15);
JLabel labelB =newJLabel("B: ");
finalJTextField textFieldB =newJTextField(15);
JButton buttonAdd =newJButton("添加");
JButton buttonDel =newJButton("删除");
JButton buttonDeselected =newJButton("取消选择");
panel.add(labelA);
panel.add(textFieldA);
panel.add(labelB);
panel.add(textFieldB);
panel.add(buttonAdd);
panel.add(buttonDel);
panel.add(buttonDeselected);
buttonAdd.addActionListener(newActionListener() {
@Override
publicvoidactionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int[] selectedRows = table.getSelectedRows();// table
// 默认情况容许多行选择
Vector rowData =newVector();
rowData.add(textFieldA.getText());
rowData.add(textFieldB.getText());
if(selectedRows.length ==0) {
defaultTableModel.addRow(rowData);
textFieldA.setText(null);
textFieldB.setText(null);
}elseif(selectedRows.length ==1) {
// System.out.println(selectedRows[0]);
defaultTableModel.insertRow(selectedRows[0] +1, rowData);
textFieldA.setText(null);
textFieldB.setText(null);
}else{
JOptionPane.showMessageDialog(container,
"Your operation is forbidden","Warning",
JOptionPane.WARNING_MESSAGE);
}
}
});
buttonDel.addActionListener(newActionListener() {
@Override
publicvoidactionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int[] selectedRows = table.getSelectedRows();// table
// 默认情况容许多行选择
for(inti =0; i
// System.out.println(selectedRows[i]);
defaultTableModel.removeRow(selectedRows[i] - i);
}
}
});
buttonDeselected.addActionListener(newActionListener() {
@Override
publicvoidactionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
table.clearSelection();
}
});
scrollPane.addMouseListener(newMouseAdapter() {
@Override
publicvoidmouseClicked(MouseEvent e) {
// System.out.println("here");
if(e.getClickCount() ==1
&& e.getButton() == MouseEvent.BUTTON1) {
table.clearSelection();
}
}
});
// make the text field focused every time the window is activated
addWindowFocusListener(newWindowAdapter() {
@Override
publicvoidwindowGainedFocus(WindowEvent e) {
// TODO Auto-generated method stub
textFieldA.requestFocus();
}
});
// **************************************************************
// 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);
finalJTableHeader tableHeader = table.getTableHeader();
tableHeader.addMouseListener(newMouseAdapter() {
@Override
publicvoidmouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// 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 =newPoint(e.getPoint());
intcolumnNum = 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);
}
}elseif(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);
}
}
});
defaultTableModel.addTableModelListener(newTableModelListener() {
@Override
publicvoidtableChanged(TableModelEvent e) {
// TODO Auto-generated method stub
inttype = e.getType();
intfirstRow = e.getFirstRow();
// int lastRow = e.getLastRow(); // the last row seems to be always equal to the first row
intcolumn = e.getColumn();
switch(type) {
caseTableModelEvent.DELETE:
System.out.print("此次事件由 删除 行触发:");
System.out.println("此次删除的是第 "+ firstRow +" 行");
break;
caseTableModelEvent.INSERT:
System.out.print("此次事件由 插入 行触发:");
System.out.println("此次插入的是第 "+ firstRow +" 行");
break;
caseTableModelEvent.UPDATE:
System.out.print("此次事件由 更新 行触发:");
System.out.println("此次更新的是第 "+ firstRow +" 行第 "+ column +" 列");
break;
default:
System.out.println("此次事件由 其他原因 触发");
}
}
});
}
/**
* @param args
*/
publicstaticvoidmain(String[] args) {
// TODO Auto-generated method stub
TableModelEvent_1 frame =newTableModelEvent_1();
frame.setTitle("表格模型事件示例");
frame.pack();//Realize the components.
// frame.setBounds(100, 100, 600, 300);
// textFieldA.requestFocus();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);//Display the window.
}
}