下面 是从csdn 中转录的 一个表格中加入    文本输入框和 按钮的 (文本输入框和 按钮先加入容器中) 源代码  但是如果想编辑单元格的话   必须用鼠标在所选择 的单元格点击 (意思是单用 鼠标的话 点击必须连续2次以上)才能编辑
   他也能 能响应键盘tab事件 tab 能依次移动焦点到 每个单元格,这是 按键盘任意键 ,只能显示 出来文本输入框和 按钮 控件,单单使用键盘无法编辑 必须用鼠标点,击一下 才能编辑。  我的想法是 当tab键 移动焦点到单元格 ,当前 单元格中间的  文本输入框 马上能 接受键盘的输入  特向各位请教!!
package a;import   java.awt.BorderLayout;
  import   java.awt.Component;
  import   java.awt.Insets;
  import   java.awt.event.ActionEvent;
  import   java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
  import   java.awt.event.MouseEvent;
  import   java.io.File;
  import   java.util.EventObject;  import   javax.swing.*;
  import   javax.swing.table.TableCellEditor;
  public   class   T1   {
          public   static   void   main(String[]   args)   {
          JTable   table   =   new   JTable(2,   5);
          table.setDefaultEditor(Object.class,   new   FilePathCellEditor());
          JScrollPane   sp   =   new   JScrollPane(table);          JFrame   f   =   new   JFrame("TableCellEditorTest");
  f.getContentPane().add(sp,   BorderLayout.CENTER);
  f.pack();
  f.setLocationRelativeTo(null);
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  f.setVisible(true);
          }
  }
  class   FilePathCellEditor   extends   AbstractCellEditor   implements   TableCellEditor{
  JPanel   panel   =   new   JPanel(new   BorderLayout());  JTextField   tf   =   new   JTextField();
  JButton   btn   =   new   JButton("...");
  JFileChooser   fileChooser   =   null;
  public   FilePathCellEditor()   {
  panel.add(tf,   BorderLayout.CENTER);
  panel.add(btn,   BorderLayout.EAST);
  tf.grabFocus();  btn.setMargin(new   Insets(0,   0,   0,   0));
  btn.addActionListener(new   ActionListener()   {
  public   void   actionPerformed(ActionEvent   e)   {
  if   (fileChooser   ==   null)   {
  fileChooser   =   new   JFileChooser();
  }
  int   r   =   fileChooser.showOpenDialog(panel);
  if   (r   ==   JFileChooser.APPROVE_OPTION)   {
  File   file   =   fileChooser.getSelectedFile();
  tf.setText(file.getPath());
  }
  }
  });
  tf.setBorder(null);
  }          public   boolean   isCellEditable(EventObject   anEvent)   {
          if   (anEvent   instanceof   MouseEvent)   {
          return   ((MouseEvent)anEvent).getClickCount()   >=   2;
          }
         if   (anEvent   instanceof   KeyEvent)   {
          return   true;
          }
          return   true;
  }  public   Object   getCellEditorValue()   {
  return   tf.getText();
  }  public   Component   getTableCellEditorComponent(
  JTable   table,   Object   value,   boolean   isSelected,   int   row,   int   column)   {  tf.setText(value   ==   null   ?   ""   :   value.toString());  return   panel;
  }
  }

解决方案 »

  1.   

    当按Tab键,跳动单元格时,获取焦点的是public Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected, int row, int column)这个方法返回的Component,
    而你实现的这个方法返回的是JPanel,而不是JTextField
    JTextField没获取焦点,显然就不能接受输入。
    所有就需要在点击一次让它获取焦点,
    如果把方法getTableCellEditorComponent 的返回值改成tf,那就可以直接输入了。
      

  2.   

    但是这样的话   jpanel里面的 按钮    就看不见了啊
      

  3.   

    我还发现 返回JTextField 时, 不用鼠标 用tab 切换 能直接 在单元格里面输入  但是 我新添加的 JTextField监听键盘回车事件 (弹出对话框)就无法响应         即使输入完成 了 还是要用鼠标点击 JTextField后  看到光标能跳动时  才能正常监听键盘回车事件  请问   用tab切换的光标  直接 在单元格里面输入             和 用鼠标点击 JTextField后 在单元格里面输入   原理是否相同 ???       用tab 切换 光标到单元格  监听键盘回车事件 上无法响应 的原因是啥 ??