簡體   English   中英

編輯時如何更改JTable單元格文本?

[英]How to change JTable cell text while editing?

我試圖達到的效果是:每次用戶開始在表中編輯單元格時,我希望該單元格的文本擦除最初存在的所有文本(“開始編輯”部分),並且如果沒有新文本添加,以將文本設置為原始文本(“停止編輯”)

在我看來,我以為setValueAt會更改當前正在編輯的單元格中的文本是錯誤的-相反,它似乎只會在編輯完成后才更改單元格的值(這意味着我可能不會完全不需要我放在“停止編輯”下的代碼)

但是,如果確實如此,我不知道如何在當前正在編輯的單元格中編輯文本,所以這是我的問題:如何更改當前正在編輯的單元格中的文本?

例如,將其設置為使得當我開始編輯“測試bb”時,該單元格更改為沒有文本:

在此處輸入圖片說明

這是我的代碼:

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

public void tablePropertyChange(JTable jtable, PropertyChangeEvent evt) {
    TableModel mdl = jtable.getModel();
    int c = jtable.getSelectedColumn();
    int r = jtable.getSelectedRow();
    if (r >= 0 && c >= 0) {
        String text = mdl.getValueAt(r, c) + "";
        if (evt.getNewValue() == null) {
            System.out.println("Stop Editing");
            String newText = mdl.getValueAt(r, c) + "";
            if (newText.length() <= 0) {
                jtable.setValueAt(text, r, c); // also tried: mdl.setValueAt(text, r, c);
            }
        } else {
            System.out.println("Start Editing");
            jtable.setValueAt("", r, c); // also tried: mdl.setValueAt("", r, c);
        }
    }
}

嘗試“干預”這種過程可能是一個真正的技巧。 您有兩個基本選擇。 您可以創建一個自定義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);
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM