无法使用setValueAt()编辑我的JTable数据

时间:2019-12-19 18:45:39

标签: java swing jtable overriding edit

在度过了一个下午的时间后,我终于创建了一个帐户来问我的问题,希望有人可以帮助我。

我正在内部框架中创建一个JTable。我有自己的tableModel和cellRenderer(因为我希望用户只能编辑表格边框的单元格,而我希望不可编辑的单元格是灰色的)。它工作正常,不可编辑的单元格是灰色的,我们对此一无所知。其他的,我们可以保留它,但是当我们修改该值并按Enter时,什么也没有发生,该值恢复为默认值。 我试图使用“ setValueAt()”方法修改代码中的单元格值,但我也不起作用。

我尝试实现一些侦听器,但没有任何效果:/。你能帮我吗?我希望我足够清楚。这是我要提供帮助的代码:

MyCellRenderer.java(完美运行)

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected,
    boolean hasFocus, int row, int column){
        if (table.isCellEditable(row, column)) {
           setBackground(Color.white);
        }
        else {
           setBackground(Color.darkGray);
        }

        return super.getTableCellRendererComponent(table, value, isSelected,
                                                   hasFocus, row, column);
   }
}

MyTableModel.java(完美运行)

import javax.swing.table.DefaultTableModel;

public class MyTableModel extends DefaultTableModel{
    public boolean[][] canEdit = new boolean[][]{};

    public void setEditModel(int maxRow, int maxCol){
        canEdit = new boolean[maxRow][maxCol];
        for(int col=0;col< maxCol; col++){
            for(int row=0;row< maxRow; row++){
                if(col == 0 || row == 0 || col == maxCol-1){
                    canEdit[row][col] = true;
                }
                else{
                    canEdit[row][col] = false;
                }
            }
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit[rowIndex][columnIndex];
    }
}

这是我主机的一部分。当我按下此按钮时,它将在内部框架中创建表格

private void jButtonValiderTailleCuisineActionPerformed(java.awt.event.ActionEvent evt) {                                                            

    MyTableModel dataModel;
    dataModel = new MyTableModel() {
            @Override public int getColumnCount() { return jSliderLongueur.getValue(); }
            @Override public int getRowCount() { return jSliderLargeur.getValue();}
            @Override public Object getValueAt(int row, int col) { return 0; }
        };
        table = new JTable(dataModel);
        dataModel.setEditModel(jSliderLargeur.getValue(), jSliderLongueur.getValue());
        table.setDragEnabled(false);
        table.setTableHeader(null);
        table.setCellSelectionEnabled(true);
        table.setRowSelectionAllowed(false);
        table.setColumnSelectionAllowed(false);
        table.setRowHeight(40);
        TableColumn column;
        for (int i = 0; i < jSliderLongueur.getValue(); i++) {
            column = table.getColumnModel().getColumn(i);
            column.setMinWidth(40);
            column.setMaxWidth(40);
        }
        System.out.println(dataModel.getValueAt(5, 5));

        JPanel m_rootPanel = new JPanel();
        JScrollPane jScrollPane1 = new JScrollPane(table);
        m_rootPanel.setLayout(new BorderLayout());
        jInternalFramePourTableau.setContentPane(m_rootPanel);
        m_rootPanel.add(jScrollPane1, BorderLayout.CENTER);

        for (int i =0; i<dataModel.getColumnCount();i++) {
            table.setDefaultRenderer(table.getColumnClass(i), new MyCellRenderer());
        }

        table.addMouseListener(new java.awt.event.MouseAdapter() {
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            int row = table.rowAtPoint(evt.getPoint());
            int col = table.columnAtPoint(evt.getPoint());
            if (row >= 0 && col >= 0) {
                selectedCell[0] = row;
                selectedCell[1] = col;
                System.out.println("Vous avez cliquez en: " + selectedCell[0] + " " + selectedCell[1]);
            }
        }
    });

        jSliderLongueur.setEnabled(false);
        jSliderLargeur.setEnabled(false);
        jButtonValiderTailleCuisine.setEnabled(false);
}

它可以工作,但是我不能编辑非灰色的单元格。所以问题可能出在我创建表的方式上。

这是我无法使用的代码(这是我按下此按钮时的代码,它必须使用“ TEST”值更改所选单元格的值):

private void jButtonChangeValueActionPerformed(java.awt.event.ActionEvent evt) {                                                
        System.out.println("CurrentCellSelected: " + selectedCell[0] + " " + selectedCell[1]);//it is the correct selectedCell
        dataModel.setValueAt("TEST", selectedCell[0], selectedCell[1]);//NOT WORKING
    } 

当我单击按钮“ jButtonChangeValueActionPerformed”时,行dataModel.setValueAt(...)无效。

我真的希望有人能帮助我,我浪费了很多时间来寻找解决方案。

大家晚上好。

3 个答案:

答案 0 :(得分:0)

您的代码中缺少以下代码:

table.getModel().addTableModelListener(new TableModelListener() {
    public void tableChanged(TableModelEvent e) {
        table.setValueAt("TEST", selectedCell[0], selectedCell[1]);
    }
});

table = new JTable(dataModel);之后添加它,以使其保持与table实例化接近,从而使您在更新代码时更容易找到它。

答案 1 :(得分:0)

好的,我补充说:

table.getModel().addTableModelListener(new TableModelListener() {
        public void tableChanged(TableModelEvent e) {

            table.getModel().removeTableModelListener(this);
            System.out.println("TABLE CHANGED");
            table.setValueAt("TEST", selectedCell[0], selectedCell[1]);
            table.getModel().addTableModelListener(this);
        }
    });

,现在只调用一次此方法。但这不能解决我的问题,数据仍然无法修改。

我认为问题出在方法setValueAt()。无论我在哪里调用此方法,它都行不通。我不知道我必须像重写TableModel一样重写它。或者,如果我必须调用一些重绘表方法?

编辑: 我试图覆盖setValueAt()方法,但是它没有用,就像我在想...

import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class MyTableModel extends DefaultTableModel{
    public boolean[][] canEdit = new boolean[][]{
        /*{true, true, true, true, true, true},
        {true, false, false, false, false, true},
        {true, false, false, false, false, true},
        {true, false, false, false, false, true},
        {true, false, false, false, false, true},
        {true, false, false, false, false, true}*/
    };
        TableModel model;

    public void setEditModel(int maxRow, int maxCol){
        canEdit = new boolean[maxRow][maxCol];
        for(int col=0;col< maxCol; col++){
            for(int row=0;row< maxRow; row++){
                if(col == 0 || row == 0 || col == maxCol-1){
                    canEdit[row][col] = true;
                }
                else{
                    canEdit[row][col] = false;
                }
            }
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit[rowIndex][columnIndex];
    }
    //useless override cause it's the same definition in DefaultTableModel
    @Override
    public void setValueAt(Object value, int row, int column) 
    {
        ((Vector) dataVector.get(row)).set(column, value);
        fireTableCellUpdated(row, column);
    }
}

答案 2 :(得分:0)

好,我解决了。 我刚刚评论了这一行:

        //public Object getValueAt(String value, int row, int col) { return value; }

在我的主框架类中创建JTable,现在它可以正常工作了!

结论:重写方法“ getValueAt()”将方法“ setValueAt()”设置为不可用。 (就我而言)。

dataModel = new MyTableModel() {
            @Override public int getColumnCount() { return jSliderLongueur.getValue(); }
            @Override public int getRowCount() { return jSliderLargeur.getValue();}
            //public Object getValueAt(String value, int row, int col) { return value; }
        };