但是如果想编辑单元格的话
必须用鼠标在所选择 的单元格点击 (意思是单用 鼠标的话 点击必须连续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,那就可以直接输入了。
而你实现的这个方法返回的是JPanel,而不是JTextField
JTextField没获取焦点,显然就不能接受输入。
所有就需要在点击一次让它获取焦点,
如果把方法getTableCellEditorComponent 的返回值改成tf,那就可以直接输入了。
#2
JPanel
#3
但是这样的话 jpanel里面的 按钮 就看不见了啊
#4
在网上 到处找资料 整了 两个星期 还是没搞好,很是郁闷
#5
我还发现 返回JTextField 时, 不用鼠标 用tab 切换 能直接 在单元格里面输入 但是 我新添加的 JTextField监听键盘回车事件 (弹出对话框)就无法响应
即使输入完成 了 还是要用鼠标点击 JTextField后 看到光标能跳动时 才能正常监听键盘回车事件
请问 用tab切换的光标 直接 在单元格里面输入
和 用鼠标点击 JTextField后 在单元格里面输入 原理是否相同 ???
用tab 切换 光标到单元格 监听键盘回车事件 上无法响应 的原因是啥 ??
即使输入完成 了 还是要用鼠标点击 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,那就可以直接输入了。
而你实现的这个方法返回的是JPanel,而不是JTextField
JTextField没获取焦点,显然就不能接受输入。
所有就需要在点击一次让它获取焦点,
如果把方法getTableCellEditorComponent 的返回值改成tf,那就可以直接输入了。
#2
JPanel
#3
但是这样的话 jpanel里面的 按钮 就看不见了啊
#4
在网上 到处找资料 整了 两个星期 还是没搞好,很是郁闷
#5
我还发现 返回JTextField 时, 不用鼠标 用tab 切换 能直接 在单元格里面输入 但是 我新添加的 JTextField监听键盘回车事件 (弹出对话框)就无法响应
即使输入完成 了 还是要用鼠标点击 JTextField后 看到光标能跳动时 才能正常监听键盘回车事件
请问 用tab切换的光标 直接 在单元格里面输入
和 用鼠标点击 JTextField后 在单元格里面输入 原理是否相同 ???
用tab 切换 光标到单元格 监听键盘回车事件 上无法响应 的原因是啥 ??
即使输入完成 了 还是要用鼠标点击 JTextField后 看到光标能跳动时 才能正常监听键盘回车事件
请问 用tab切换的光标 直接 在单元格里面输入
和 用鼠标点击 JTextField后 在单元格里面输入 原理是否相同 ???
用tab 切换 光标到单元格 监听键盘回车事件 上无法响应 的原因是啥 ??