无法使用 setValueAt() 编辑我的 JTable 数据
Can't edit my JTable data with setValueAt()
在花了我一个下午的时间寻找解决方案后,我终于创建了一个帐户来提出我的问题,希望有人能帮助我。
我正在内部框架中创建 JTable。我有自己的 tableModel 和 cellRenderer(因为我希望用户只能编辑 table 边框的单元格,并且我希望 uneditable 单元格是灰色的)。它工作正常,uneditable 单元格是灰色的,我们不能点击它。其他的,我们可以点击它,但是当我们修改值并按回车键时,没有任何反应,值恢复为默认值。
我尝试使用 "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];
}
}
这是我的主框架的一部分。当我按下此按钮时,它会在内部框架
中创建 table
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);
}
它有效,但我无法编辑非灰色的单元格。所以问题可能是我创建 table.
的方式
这是我不工作的代码(当我按下这个按钮时,它必须用值 "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(...) 什么都不做。
我真的希望有人能帮助我,我浪费了很多时间试图找到解决方案。
大家晚上好
好的,我补充说:
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 一样重写它。或者如果我必须调用一些 redraw-table 方法?
编辑:
我试图覆盖 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);
}
}
好的,我解决了。
我刚刚评论了这行:
//public Object getValueAt(String value, int row, int col) { return value; }
在我的主框架 class 中创建我的 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; }
};
在花了我一个下午的时间寻找解决方案后,我终于创建了一个帐户来提出我的问题,希望有人能帮助我。
我正在内部框架中创建 JTable。我有自己的 tableModel 和 cellRenderer(因为我希望用户只能编辑 table 边框的单元格,并且我希望 uneditable 单元格是灰色的)。它工作正常,uneditable 单元格是灰色的,我们不能点击它。其他的,我们可以点击它,但是当我们修改值并按回车键时,没有任何反应,值恢复为默认值。 我尝试使用 "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];
}
}
这是我的主框架的一部分。当我按下此按钮时,它会在内部框架
中创建 tableprivate 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);
}
它有效,但我无法编辑非灰色的单元格。所以问题可能是我创建 table.
的方式这是我不工作的代码(当我按下这个按钮时,它必须用值 "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(...) 什么都不做。
我真的希望有人能帮助我,我浪费了很多时间试图找到解决方案。
大家晚上好
好的,我补充说:
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 一样重写它。或者如果我必须调用一些 redraw-table 方法?
编辑: 我试图覆盖 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);
}
}
好的,我解决了。 我刚刚评论了这行:
//public Object getValueAt(String value, int row, int col) { return value; }
在我的主框架 class 中创建我的 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; }
};