Java 如何在编辑时更改JTable单元格文本?

Java 如何在编辑时更改JTable单元格文本?,java,swing,jtable,Java,Swing,Jtable,我试图达到的效果是:每次用户开始编辑表中的单元格时,我都希望单元格的文本删除原始文本(“开始编辑”部分),如果没有添加新文本,则只需将文本设置为原始文本(“停止编辑”) 在我看来,我认为setValueAt会更改当前正在编辑的单元格中的文本是错误的——相反,它似乎只会在编辑完成后更改单元格的值(这意味着我可能根本不需要我放在“停止编辑”下的代码) 但是,如果确实如此,我不知道如何编辑当前正在编辑的单元格中的文本,因此这是我的问题:如何更改当前正在编辑的单元格中的文本? 例如,使其在我开始编辑“T

我试图达到的效果是:每次用户开始编辑表中的单元格时,我都希望单元格的文本删除原始文本(“开始编辑”部分),如果没有添加新文本,则只需将文本设置为原始文本(“停止编辑”)

在我看来,我认为setValueAt会更改当前正在编辑的单元格中的文本是错误的——相反,它似乎只会在编辑完成后更改单元格的值(这意味着我可能根本不需要我放在“停止编辑”下的代码)

但是,如果确实如此,我不知道如何编辑当前正在编辑的单元格中的文本,因此这是我的问题:如何更改当前正在编辑的单元格中的文本?

例如,使其在我开始编辑“Test bb”时,单元格变为没有文本:

这是我的密码:

 private void tblEntriesPropertyChange(java.beans.PropertyChangeEvent evt) {                                          
    swb.tablePropertyChange(tblEntries, evt);
}                 

公共作废表PropertyChange(JTable JTable,PropertyChangeEvent evt){
TableModel mdl=jtable.getModel();
int c=jtable.getSelectedColumn();
int r=jtable.getSelectedRow();
如果(r>=0&&c>=0){
String text=mdl.getValueAt(r,c)+;
if(evt.getNewValue()==null){
System.out.println(“停止编辑”);
字符串newText=mdl.getValueAt(r,c)+;
如果(newText.length()试图“干预”在这种情况下,这可能是一个真正的把戏。您有两个基本选项。您可以创建一个自定义
JTable
实现,并确保将
null
之类的内容传递给任何激活的编辑器,这会将您锁定为一次性使用
JTable
,或者您可以提供自己的编辑器

public class CleanCellEditor extends DefaultCellEditor {

    public static CleanCellEditor make() {
        JTextField field = new JTextField();
        field.setBorder(null);
        System.out.println("make");

        return new CleanCellEditor(field);
    }

    public CleanCellEditor(JTextField textField) {
        super(textField);
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return super.getTableCellEditorComponent(table, null, isSelected, row, column);
    }

}
虽然这稍微好一点,但实际上您可以将其应用于
JTable
的任何实现,这确实意味着您需要为表中可能需要支持的所有可能的值/类型创建一个

作为一个基本的例子

import java.awt.Component;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D"}, 0);
                for (int row = 0; row < 10; row++) {
                    Vector data = new Vector(model.getColumnCount());
                    for (int col = 0; col < model.getColumnCount(); col++) {
                        data.add(row + "x" + col);
                    }
                    model.addRow(data);
                }

                JTable table = new JTable(model);
                table.setDefaultEditor(Object.class, CleanCellEditor.make());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class CleanCellEditor extends DefaultCellEditor {

        public static CleanCellEditor make() {
            JTextField field = new JTextField();
            field.setBorder(null);
            System.out.println("make");

            return new CleanCellEditor(field);
        }

        public CleanCellEditor(JTextField textField) {
            super(textField);
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            return super.getTableCellEditorComponent(table, null, isSelected, row, column);
        }

    }

}
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.util.Vector;
导入javax.swing.AbstractCellEditor;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JTextField;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.EmptyBorder;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellEditor;
导入javax.swing.table.TableColumn;
导入javax.swing.table.TableColumnModel;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
DefaultTableModel=new DefaultTableModel(新对象[]{“A”、“B”、“C”、“D”},0);
对于(int行=0;行<10;行++){
向量数据=新向量(model.getColumnCount());
for(int col=0;col
试图“干预”在这种情况下,这可能是一个真正的把戏。您有两个基本选项。您可以创建一个自定义
JTable
实现,并确保将
null
之类的内容传递给任何激活的编辑器,这会将您锁定为一次性使用
JTable
,或者您可以提供自己的编辑器

public class CleanCellEditor extends DefaultCellEditor {

    public static CleanCellEditor make() {
        JTextField field = new JTextField();
        field.setBorder(null);
        System.out.println("make");

        return new CleanCellEditor(field);
    }

    public CleanCellEditor(JTextField textField) {
        super(textField);
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return super.getTableCellEditorComponent(table, null, isSelected, row, column);
    }

}
虽然这稍微好一点,但实际上您可以将其应用于
JTable
的任何实现,这确实意味着您需要为表中可能需要支持的所有可能的值/类型创建一个

作为一个基本的例子

import java.awt.Component;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D"}, 0);
                for (int row = 0; row < 10; row++) {
                    Vector data = new Vector(model.getColumnCount());
                    for (int col = 0; col < model.getColumnCount(); col++) {
                        data.add(row + "x" + col);
                    }
                    model.addRow(data);
                }

                JTable table = new JTable(model);
                table.setDefaultEditor(Object.class, CleanCellEditor.make());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class CleanCellEditor extends DefaultCellEditor {

        public static CleanCellEditor make() {
            JTextField field = new JTextField();
            field.setBorder(null);
            System.out.println("make");

            return new CleanCellEditor(field);
        }

        public CleanCellEditor(JTextField textField) {
            super(textField);
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            return super.getTableCellEditorComponent(table, null, isSelected, row, column);
        }

    }

}
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.util.Vector;
导入javax.swing.AbstractCellEditor;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JTextField;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.EmptyBorder;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellEditor;
导入javax.swing.table.TableColumn;
导入javax.swing.table.TableColumnModel;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){