本着碰到一个问题就解决一个的精神 我又来提问了
  
  jtable 表格单元格    加入了    面板jplane
                                 面板里面有    jtextfield 和 Button       用tab 换焦点到单元格  但是无法直接录入数据(和加入控件之前相比) 
                                 必须用鼠标双击 才能进入编辑(我想肯定是焦点控制问题)
 
                            我先后给JPanel 添加了 键盘事件监听 
                                                   焦点事件监听
                        目的      让 jtextfield 得到焦点  就可以直接录入数据了  但是没有实现 特向大家请教
             
  
package newpackage;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.MouseEvent;
import java.io.File;
import java.util.EventObject;import javax.swing.*;
import javax.swing.table.TableCellEditor;
public class TT {    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);       
        panel.addFocusListener(new java.awt.event.FocusAdapter() {            public void focusGained(java.awt.event.FocusEvent evt) {
                if (evt.getSource() == panel) {
                    tf.requestFocus();
                }            }
        });
        btn.setMargin(new Insets(0, 0, 0, 0));
        btn.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {
            JFrame jf=new JFrame("知识就是力量") ;
            jf.setSize(333,444);
            jf.setVisible(true);            }
        });
        tf.setBorder(null);
    }    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) {
            return ((MouseEvent) anEvent).getClickCount() >= 2;
        }
        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());          panel.addKeyListener(new java.awt.event.KeyAdapter() {            public void keyPressed(java.awt.event.KeyEvent evt) {                if (evt.getSource() == panel) {
                    tf.requestFocus();                }            }
        });
        return panel;
    }
}

解决方案 »

  1.   

    最后一行如果返回 jtextfield 当然能实现,但是没有价值了,因为按钮控件就没有了
      在按钮上还要实现功能
      

  2.   

    貌似楼主addFocusListener加错了地方,Focus应该加在table上。
    可以在  tf.requestFocus(); 后面打印下,看看究竟有没有被调用到
      

  3.   

    这几天很忙,没看到。其实很简单的问题。
    getTableCellEditorComponent这个方法只是负责得到一个component并且根据这个对象去绘制。不会顾及什么焦点问题。我单独封装了一个表格控件。你可以看一下。你距离真相近在咫尺啊~~
    三个类。在你前面的基础上更改的,但是做了一次封装。名字没有改,所以可能类名已经不是很合适了。
    请查看package focusnext;import java.awt.BorderLayout;
    import java.awt.Container;
    import java.util.Vector;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.table.DefaultTableModel;public class FocusNextEditableTableFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    FocusNextEditableTable t;
    private String colNames[] = new String[] { "能编辑1", "Title 2", "能编辑3",
    "标题 4", "标题 5", "标题 6", "标题 15", "标题 18", "能编辑" };
    private Vector<Vector<String>> data = new Vector<Vector<String>>();
    private boolean[] canEdit = new boolean[] { true, false, true, false,
    false, true, false, false, true }; public FocusNextEditableTableFrame() {
    super();
    initTestData();
    Container c = getContentPane();
    c.setLayout(new BorderLayout()); t = new FocusNextEditableTable();
    t.setModel(new DefaultTableModel() {
    private static final long serialVersionUID = 1L; @Override
    public int getRowCount() {
    return data.size();
    } @Override
    public int getColumnCount() {
    return colNames.length;
    } @Override
    public Object getValueAt(int row, int column) {
    Object value = data.get(row).get(column);
    return value == null ? "" : value.toString();
    } @Override
    public String getColumnName(int column) {
    return colNames[column];
    } @Override
    public void setValueAt(Object value, int row, int column) {
    data.get(row)
    .set(column, value == null ? "" : value.toString());
    } @Override
    public boolean isCellEditable(int row, int column) {
    return canEdit[column];
    }
    }); c.add(new JScrollPane(t));
    t.getColumnModel().getColumn(0).setCellEditor(new FilePathCellEditor()); setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(600, 400);
    setLocationRelativeTo(null);
    setVisible(true);
    } private void initTestData() {
    for (int i = 0; i < 20; i++) {
    Vector<String> v = new Vector<String>();
    for (int j = 0; j < 9; j++) {
    v.add("");
    }
    data.add(v);
    }
    } public static void main(String[] args) {
    new FocusNextEditableTableFrame();
    }
    }package focusnext;import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;import javax.swing.AbstractAction;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.KeyStroke;
    import javax.swing.ListSelectionModel;public class FocusNextEditableTable extends JTable { private static final long serialVersionUID = 1L; private KeyListener listener = new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    if (e.getSource() != FocusNextEditableTable.this) {
    e.setSource(FocusNextEditableTable.this);
    FocusNextEditableTable.this.dispatchEvent(e);
    }
    }
    }; }; AbstractAction moveForward = new AbstractAction() {
    private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) {
    int row = getSelectedRow();
    int col = getSelectedColumn();
    row = row < 0 ? 0 : row; int nextFocusRow = row;
    int nextFocusCol = col; do {
    nextFocusCol++;
    if (nextFocusCol >= getColumnCount()) {
    nextFocusCol = 0;
    nextFocusRow++;
    nextFocusRow = nextFocusRow >= getRowCount() ? 0
    : nextFocusRow;
    }
    } while (!isCellEditable(nextFocusRow, nextFocusCol));
    changeSelection(nextFocusRow, nextFocusCol, false, false);
    editCellAt(nextFocusRow, nextFocusCol);
    };
    }; public FocusNextEditableTable() {
    super();
    setRowSelectionAllowed(false);
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    addKeyListener(listener); getActionMap()
    .remove(
    getInputMap().get(
    KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)));
    getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
    "moveForward");
    getActionMap().put("moveForward", moveForward);
    } @Override
    public boolean editCellAt(int row, int column) {
    boolean editCellAt = super.editCellAt(row, column);
    Component comp = getEditorComponent();
    if (comp != null) {
    comp.addKeyListener(listener);
    comp.requestFocus();
    if (comp instanceof JTextField) {
    ((JTextField) comp).selectAll();
    }
    }
    return editCellAt;
    }}
    package focusnext;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.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.JTextField;public class FilePathCellEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L;
    private JTextField tf = new JTextField();
    private JButton btn = new JButton("...");
    private JPanel panel = new JPanel() {
    private static final long serialVersionUID = 1L; @Override
    public void requestFocus() {
    super.requestFocus();
    tf.requestFocus();
    tf.selectAll();
    }
    }; private KeyListener l = null; public FilePathCellEditor() {
    super(new JTextField()); btn.setMargin(new Insets(0, 0, 0, 0));
    panel.setLayout(new BorderLayout());
    panel.add(tf);
    panel.add(btn, BorderLayout.EAST);
    panel.setOpaque(true);
    btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    int rs = Integer.MIN_VALUE;
    while (rs != JOptionPane.YES_OPTION) {
    rs = JOptionPane.showConfirmDialog(panel.getParent(), "你服不服?","",JOptionPane.YES_NO_OPTION
    );
    }
    }
    });
    } @Override
    public Component getTableCellEditorComponent(final JTable table,
    Object value, boolean isSelected, int row, int column) {
    tf.setText(value == null ? "" : value.toString());
    l = new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    e.setSource(table);
    table.dispatchEvent(e);
    }
    }
    };
    tf.addKeyListener(l);
    btn.addKeyListener(l);
    return panel;
    } @Override
    public boolean stopCellEditing() {
    if (l != null) {
    btn.removeKeyListener(l);
    tf.removeKeyListener(l);
    }
    return super.stopCellEditing();
    } @Override
    public Object getCellEditorValue() {
    return tf.getText().trim();
    }
    }
      

  4.   

    不愧是真正swing的高手啊,强悍!!
       
            不知道老弟现在在忙啥项目哦,能讲来听听吗??  人多思路多,,,