遇到这样一个问题---->对table操作,点击enter键自动跳到下一行,同时原来编辑的Cell数据保存,废了N牛之力终于搞了出来,贴出来,希望大家批评指正
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.DefaultCellEditor;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SpringLayout;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class TablePanel extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
private SpringLayout layout = new SpringLayout();
private JTable table;
public TablePanel(){
this.setPreferredSize(new Dimension(300,300));
this.setLayout(this.layout);
table = new JTable();
Object[][] data = new Object[][]{
{"", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", ""},
};
TableModel model = new TableModel(data, new String[] { "1","2", "3", "4", "5", "6", "7", "8"});
table.setActionMap(null);
setNextFocus();
table.setModel(model);
int colCount = table.getColumnModel().getColumnCount();
for (int i = 0; i < colCount; i++) {
CellEdit edit = new CellEdit(new JTextField());
edit.setClickCountToStart(1);
TableColumn column = table.getColumnModel().getColumn(i);
column.setCellEditor(edit);
}
JScrollPane scrollPane = new JScrollPane(table);
this.add(scrollPane);
layout.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.NORTH, this);
layout.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, this);
}
private void setNextFocus() {
InputMap inputMap = table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke entry = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
Object tabOperObject = inputMap.get(tab);
inputMap.remove(entry);
inputMap.put(entry, tabOperObject);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new TablePanel();
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class CellEdit extends DefaultCellEditor{
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField field;
private int rowIndex;
private int colIndex;
private JTable table;
public CellEdit(JTextField textField) {
super(textField);
field = textField;
for(KeyListener kl:field.getKeyListeners()){
field.removeKeyListener(kl);
}
field.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
setSelectCell();
}
}
});
field.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent event) {
field.requestFocusInWindow();
}
public void ancestorMoved(AncestorEvent event) {
// logger.debug("aaaaa moved");
}
public void ancestorRemoved(AncestorEvent event) {
// logger.debug("aaaaa remove");
}
}
);
}
@Override
public Component getTableCellEditorComponent(JTable table,Object value, boolean isSelected, int row, int column) {
this.rowIndex = row;
this.colIndex = column;
this.table = table;
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
protected void setSelectCell() {
int nextRow = rowIndex;
if (rowIndex == this.table.getRowCount() -1) {
nextRow = 0;
} else {
nextRow++;
}
this.table.editCellAt(nextRow,colIndex);
this.table.scrollRectToVisible(this.table.getCellRect(nextRow, colIndex, true));
}
public void setClickCountToStart(int arg0) {
super.setClickCountToStart(1);
}
}
class TableModel extends DefaultTableModel{
/**
*
*/
private static final long serialVersionUID = 1L;
public TableModel(Object[][] data, String[] strings) {
super(data, strings);
}
public void setValueAt(Object value, int row, int column) {
// TODO Auto-generated method stub
super.setValueAt(value, row, column);
saveData();
}
private void saveData() {
}
}
}