繁体   English   中英

JTable单元格值

[英]JTable cell value

我正在创建一个嵌套JTable的程序。 为了创建JTable我创建了一个AbstractTableModel ,它重写了setValueAtisCellEditable等方法(代码张贴在底部)。 我还添加了一个tableModelListener与方法tableChanged其中保留表格以通知的小区值已更改的类。 当我将一个单元格值更改为另一个值时,侦听器会正常工作并更改该单元格值。 问题是,当我将单元格值更改为null(实际上删除单元格的值)时,侦听器将不起作用,并且值保持不变。 任何想法我该如何解决?

类单元:

public class Cell {
    private int x;
    private int y;
    private String content;

    public Cell(int x, int y){
        this.x = x;
        this.y = y;
        this.content = content;
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;

    }

    public String getContent(){
        return content;
    }

    public void setContent(String content){
        this.content = content;
    }
}

类CreateTable:

import javax.swing.table.AbstractTableModel;
import javax.swing.undo.UndoManager;


public class CreateTable extends AbstractTableModel {
    private int nrows=1000;
    private int ncolumns=26;
    private String[] columnNames;
    private Cell[][] data;

    public CreateTable(int nrows,int ncolumns){
        this.nrows = nrows;
        this.ncolumns = ncolumns;
        this.columnNames= new String[ncolumns];
        this.data = new Cell[nrows][ncolumns];
        for (int i=0;i<ncolumns;i++){
            columnNames[i] = super.getColumnName(i);
        }

        for (int i=0;i<data.length;i++){
            for (int j=0;j<columnNames.length;j++){
                data[i][j] = new Cell(i,j);
            }
        }
    }

    public CreateTable(){
        this.columnNames= new String[ncolumns];
        this.data = new Cell[nrows][ncolumns];
        for (int i=0;i<ncolumns;i++){
            columnNames[i] = super.getColumnName(i);
        }

        for (int i=0;i<data.length;i++){
            for (int j=0;j<columnNames.length;j++){
                data[i][j] = new Cell(i,j);
            }
        }
    }
    public int getColumnCount() {
        // TODO Auto-generated method stub
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return data.length;
    }

    @Override
    public String getValueAt(int row, int col) {
        // TODO Auto-generated method stub
        return data[row][col].getContent();
    }

    public void setValueAt(Object value,int row,int col){
        if(value == null || value.toString().isEmpty()){
            return;
        }

        data[row][col].setContent(value.toString());
        fireTableCellUpdated(row,col);
    }

    public boolean isCellEditable(int row, int col){
        return true;
    }

    public void setRowCount(int nrows){

    }

    public int findColumn(String columnName){
        for (int i=0;i<getColumnCount();i++){
            if (columnName.equals(columnNames[i])){
                return i;
            }
        }
        return -1;
    }
}

表侦听器的部分类表:

public class Sheet extends JTable {
    private int nrows;
    private int ncolumns;
    private String name;

    public Sheet(String name,int nrows,int ncolumns){
        this.name = name;
        this.setModel(new CreateTable(nrows,ncolumns));
        this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        this.getModel().addTableModelListener(e->{
            int row = this.getEditingRow();
            int column = this.getEditingColumn();


        });

        this.setCellSelectionEnabled(true);
    }
}

当我将单元格的值更改为null(实际上删除该单元格的值)时,侦听器将不起作用,并且值保持不变。

正如MadProgrammer在评论中提到的那样,您的问题出在

public void setValueAt(Object value,int row,int col){

    if(value == null || value.toString().isEmpty()){
        return;
    }

    data[row][col].setContent(value.toString());
    fireTableCellUpdated(row,col);
}

如果值是非空或空字符串,则将单元格的内容设置为该字符串。 但是,如果字符串为空(不确定如何将其设置为null ),则您什么也不做 ,因此当前值保持不变

你想要的可能是

public void setValueAt(Object value,int row,int col){

    if(value == null || value.toString().isEmpty()){
        data[row][col].setContent("");
    }
    else {
        data[row][col].setContent(value.toString());
    }
    fireTableCellUpdated(row,col);
}

但由于truefalse的条件if这样做,只是做

public void setValueAt(Object value,int row,int col){

    data[row][col].setContent(value.toString());
    fireTableCellUpdated(row,col);
}

(再次,除非value可以某种方式为null 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM