对table操作,点击enter键自动跳到下一行

来源:互联网 发布:软件外包公司介绍 编辑:程序博客网 时间:2024/06/05 07:37

遇到这样一个问题---->对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() {
   
  }

  
     
    }
}