簡體   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