下面 是从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;
}
}
他也能 能响应键盘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;
}
}
而你实现的这个方法返回的是JPanel,而不是JTextField
JTextField没获取焦点,显然就不能接受输入。
所有就需要在点击一次让它获取焦点,
如果把方法getTableCellEditorComponent 的返回值改成tf,那就可以直接输入了。