[英]JTable cell value
我正在創建一個嵌套JTable
的程序。 為了創建JTable
我創建了一個AbstractTableModel
,它重寫了setValueAt
, isCellEditable
等方法(代碼張貼在底部)。 我還添加了一個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);
}
但由於true
和false
的條件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.