Java 如何在cellchange上创建JTable选择所有文本

Java 如何在cellchange上创建JTable选择所有文本,java,swing,select,jtable,tablecelleditor,Java,Swing,Select,Jtable,Tablecelleditor,我见过一些这样做的例子,但我仍然不能理解,也不能实现它 我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它 有什么办法吗 //更新// 不知怎的,我终于写出了下面的课程,但是 实现这一点 setDefaultEditor(String.class,new Classes.CellEditor()) 不产生任何结果,不会抛出“尚未受支持” 我应该如何解决这个问题 import java.awt.Component; import java.util.EventObj

我见过一些这样做的例子,但我仍然不能理解,也不能实现它

我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它

有什么办法吗

//更新// 不知怎的,我终于写出了下面的课程,但是

实现这一点
setDefaultEditor(String.class,new Classes.CellEditor())

不产生任何结果,不会抛出“尚未受支持”

我应该如何解决这个问题

import java.awt.Component;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;


public class CellEditor extends JTextField implements TableCellEditor {


public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    //        final JTextField ec = (JTextField) editorComponent;
    //
    //        ec.setText((String) value);
    //
    //        // selectAll, so that whatever the user types replaces what we just put there
    //        ec.selectAll();
    //
    //        SwingUtilities.invokeLater(new Runnable() {
    //
    //            public void run() {
    //                // make the component take the keyboard focus, so the backspace key works
    //                ec.requestFocus();
    //
    //                SwingUtilities.invokeLater(new Runnable() {
    //
    //                    public void run() {
    //                        // at this point the user has typed something into the cell and we
    //                        // want the caret to be AFTER that character, so that the next one
    //                        // comes in on the RHS
    //                        ec.setCaretPosition(ec.getText().length());
    //                    }
    //                });
    //            }
    //        });
    //        return editorComponent;


    throw new UnsupportedOperationException("Not supported yet.");
}

public Object getCellEditorValue() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean isCellEditable(EventObject anEvent) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean shouldSelectCell(EventObject anEvent) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean stopCellEditing() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void cancelCellEditing() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void addCellEditorListener(CellEditorListener l) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void removeCellEditorListener(CellEditorListener l) {
    throw new UnsupportedOperationException("Not supported yet.");
}
}
这应该会有所帮助

关于
editorComponent
,在哪里初始化此变量

变量
editorComponent
是一个字段

而不是

class CellEditor extends JTextField implements TableCellEditor
考虑

class CellEditor extends DefaultCellEditor
然后你可以这样做:

@Override
public Component getTableCellEditorComponent(JTable table,
        Object value, boolean isSelected, int row, int column) {
    JTextField ec = (JTextField) editorComponent;
    if (isSelected) {
        ec.selectAll();
    }
    return editorComponent;
}
附录:正如@所建议并在本文中所示,当鼠标单击开始编辑时,您可以有选择地重新排列
selectAll()

JTable table = new JTable(model) {

    @Override // Always selectAll()
    public boolean editCellAt(int row, int column, EventObject e) {
        boolean result = super.editCellAt(row, column, e);
        final Component editor = getEditorComponent();
        if (editor == null || !(editor instanceof JTextComponent)) {
            return result;
        }
        if (e instanceof MouseEvent) {
            EventQueue.invokeLater(() -> {
                ((JTextComponent) editor).selectAll();
            });
        } else {
            ((JTextComponent) editor).selectAll();
        }
        return result;
    }
};
我想做的是单元格更改(焦点),下一个选定的单元格将选择所有文本,用户可以完全更改它

解决方案取决于您的确切要求。JTable有一个渲染器和一个编辑器

渲染通常只显示单元格中的文本。如果要在开始键入时替换文本,则需要做两件事:

a) 更改渲染器以“选定”状态显示文本,以便用户知道键入字符将删除现有文本 b) 更改编辑器以在调用时选择所有文本

这种方法相对比较困难,因为您需要为表中的每种不同数据类型(例如字符串、整数)提供自定义呈现程序

或者另一种方法是在每个单元格获得焦点时自动将其置于编辑模式,因此您只需更改编辑器即可选择文本

这种方法很简单,因为您只需执行以下操作:

JTable table = new JTable(data, columnNames)
{
    //  Place cell in edit mode when it 'gains focus'

    public void changeSelection(
        int row, int column, boolean toggle, boolean extend)
    {
        super.changeSelection(row, column, toggle, extend);

        if (editCellAt(row, column))
        {
            Component editor = getEditorComponent();
            editor.requestFocusInWindow();
            ((JTextComponent)editor).selectAll();
        }
    }
};

关于editorComponent,我应该在哪里初始化这个变量?这个
easy
方法可以添加到NetBeans表中吗?我的项目基本上完成了,除了默认的NetBeans调色板JTable很糟糕之外。但是这个项目已经超出了预算,所以我不想从头开始重新设计它的一部分。我还看到了您的精细表格全选编辑器示例,但不确定如何将其应用于NetBeans调色板JTable。@jacknad:camickr的有见地的文章也被引用和引用。向前看,考虑限制你使用的GUI编辑器的轮廓。好的解决方案。试过其他几种,但效果不如这个好。我正在使用GlazedList,上面的解决方案也适用于它。