jtable 加入自定义的控件 的键盘响应事件 问题

时间:2023-01-01 18:31:22
   下面 是从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;
  }
  }


























5 个解决方案

#1


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

#2


JPanel

#3


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

#4


在网上 到处找资料 整了 两个星期 还是没搞好,很是郁闷

#5


我还发现 返回JTextField 时, 不用鼠标 用tab 切换 能直接 在单元格里面输入  但是 我新添加的 JTextField监听键盘回车事件 (弹出对话框)就无法响应 

        即使输入完成 了 还是要用鼠标点击 JTextField后  看到光标能跳动时  才能正常监听键盘回车事件

  请问   用tab切换的光标  直接 在单元格里面输入   

          和 用鼠标点击 JTextField后 在单元格里面输入   原理是否相同 ???

       用tab 切换 光标到单元格  监听键盘回车事件 上无法响应 的原因是啥 ?? 

#1


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

#2


JPanel

#3


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

#4


在网上 到处找资料 整了 两个星期 还是没搞好,很是郁闷

#5


我还发现 返回JTextField 时, 不用鼠标 用tab 切换 能直接 在单元格里面输入  但是 我新添加的 JTextField监听键盘回车事件 (弹出对话框)就无法响应 

        即使输入完成 了 还是要用鼠标点击 JTextField后  看到光标能跳动时  才能正常监听键盘回车事件

  请问   用tab切换的光标  直接 在单元格里面输入   

          和 用鼠标点击 JTextField后 在单元格里面输入   原理是否相同 ???

       用tab 切换 光标到单元格  监听键盘回车事件 上无法响应 的原因是啥 ??