- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个像上面这样的表格。最初,除了按钮列之外的所有单元格都是不可编辑的。我使用自定义 TableModel
创建了表格。我在自定义 TableModel
中的 isCellEditable
如下所示:
public boolean isCellEditable(int rowIndex, int columnIndex) {
//System.out.println("isCellEditable: " + rowIndex + " " + columnIndex);
if(getColumnClass(columnIndex) == JButton.class)
return true;
else
return false;
}
但是当我点击每一行的编辑按钮时,JDialog
将弹出该行(通过在该对话框中构建一个只有一行的 JTable
。)我可以更新此 JDialog 表中的单元格值。然后在该行的相应单元格中更新它们。
我在此处更新后成功更新了主表的行,前提是我的 isCellEditable
返回 true。但这不应该发生。只有当我点击时,我才能将行的 isCellEditable
更改为可编辑并更新,然后使其不可编辑。
我看到了以下post但无法实现。
最佳答案
XxxTableModel
将 JButton
的 String.class
存储为 Renderer
/Editor
JTable
还有你的代码(基于)
编辑
默认表模型
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableButton3 extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableButton3() {
String[] columnNames = {"Date", "String", "Decimal", "Remove"};
Object[][] data = {
{new Date(), "A", new Double(5.1), "Remove"}, {new Date(), "B", new Double(6.2), "Remove"},
{new Date(), "C", new Double(7.3), "Remove"}, {new Date(), "D", new Double(8.4), "Remove"},
{new Date(), "A", new Double(5.1), "Remove"}, {new Date(), "B", new Double(6.2), "Remove"},};
DefaultTableModel model = new DefaultTableModel(data, columnNames){
private static final long serialVersionUID = 1L;
@Override// Returning the Class of each column will allow different renderers to be used based on Class
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Date.class;
case 2:
return Double.class;
default:
return String.class;
}
//return getValueAt(0, column).getClass();
}
};
table = new JTable(model) ;
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
ButtonColumn buttonColumn = new ButtonColumn(table, delete, 3);
buttonColumn.setMnemonic(KeyEvent.VK_D);
}
public static void main(String[] args) {
TableButton3 frame = new TableButton3();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
//
private Action delete = new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int modelRow = Integer.valueOf(e.getActionCommand());
((DefaultTableModel) table.getModel()).removeRow(modelRow);
table.clearSelection();
}
};
}
抽象表模型
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableButton3 extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
private MyTableModel myModel = new MyTableModel();
public TableButton3() {
String[] columnNames = {"Date", "String", "Decimal", "Remove"};
Object[][] data = {
{new Date(), "A", new Double(5.1), "Remove"}, {new Date(), "B", new Double(6.2), "Remove"},
{new Date(), "C", new Double(7.3), "Remove"}, {new Date(), "D", new Double(8.4), "Remove"},
{new Date(), "A", new Double(5.1), "Remove"}, {new Date(), "B", new Double(6.2), "Remove"},};
DefaultTableModel model = new DefaultTableModel(data, columnNames){
private static final long serialVersionUID = 1L;
@Override// Returning the Class of each column will allow different renderers to be used based on Class
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Date.class;
case 2:
return Double.class;
default:
return String.class;
}
//return getValueAt(0, column).getClass();
}
};
table = new JTable(model);
table = new JTable(myModel);
addTableDatas();
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
ButtonColumn buttonColumn = new ButtonColumn(table, delete, 3);
buttonColumn.setMnemonic(KeyEvent.VK_D);
}
public static void main(String[] args) {
TableButton3 frame = new TableButton3();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private void addTableDatas() {
Vector<String> columnNameS = new Vector<String>();
columnNameS.add("Date");
columnNameS.add("String");
columnNameS.add("Decimal");
columnNameS.add("Remove");
myModel.setColumnNames(columnNameS);
Vector<Object> row1 = new Vector<Object>();
row1.add(new Date());
row1.add("A");
row1.add(new Double(5.1));
row1.add("Remove");
myModel.addRow(row1);
row1 = new Vector<Object>();
row1.add(new Date());
row1.add("B");
row1.add(new Double(6.2));
row1.add("Remove");
myModel.addRow(row1);
row1 = new Vector<Object>();
row1.add(new Date());
row1.add("B");
row1.add(new Double(8.4));
row1.add("Remove");
myModel.addRow(row1);
row1 = new Vector<Object>();
row1.add(new Date());
row1.add("B");
row1.add(new Double(5.1));
row1.add("Remove");
myModel.addRow(row1);
row1 = new Vector<Object>();
row1.add(new Date());
row1.add("B");
row1.add(new Double(6.2));
row1.add("Remove");
myModel.addRow(row1);
}
private class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private Vector<Vector<Object>> data;
private Vector<String> colNames;
private boolean[] _columnsVisible = {true, true, true, true};
public MyTableModel() {
this.colNames = new Vector<String>();
this.data = new Vector<Vector<Object>>();
}
public MyTableModel(Vector<String> colnames) {
this.colNames = colnames;
this.data = new Vector<Vector<Object>>();
}
public void resetTable() {
this.colNames.removeAllElements();
this.data.removeAllElements();
}
public void setColumnNames(Vector<String> colNames) {
this.colNames = colNames;
this.fireTableStructureChanged();
}
public void addRow(Vector<Object> data) {
this.data.add(data);
this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public void removeRowAt(int row) {
this.data.removeElementAt(row);
this.fireTableRowsDeleted(row - 1, data.size() - 1);
}
@Override
public int getColumnCount() {
return this.colNames.size();
}
@Override
public Class<?> getColumnClass(int colNum) {
switch (colNum) {
case 0:
return Date.class;
case 2:
return Double.class;
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int row, int colNum) {
switch (colNum) {
default:
return true;
}
}
@Override
public String getColumnName(int colNum) {
return this.colNames.get(colNum);
}
@Override
public int getRowCount() {
return this.data.size();
}
@Override
public Object getValueAt(int row, int col) {
Vector<Object> value = this.data.get(row);
return value.get(col);
}
@Override
public void setValueAt(Object newVal, int row, int col) {
Vector<Object> aRow = data.elementAt(row);
aRow.remove(col);
aRow.insertElementAt(newVal, col);
fireTableCellUpdated(row, col);
}
public void setColumnVisible(int index, boolean visible) {
this._columnsVisible[index] = visible;
this.fireTableStructureChanged();
}
}
//
private Action delete = new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int modelRow = Integer.valueOf(e.getActionCommand());
((DefaultTableModel) table.getModel()).removeRow(modelRow);
table.clearSelection();
}
};
}
两者都返回相同的 GUI,具有相同的 ...
关于java - 使用自定义 TableModel 使 isCellEditable 在按钮单击时对特定行为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12405605/
我想在第 0 列复选框为 false 并且复选框值为 true 时禁用编辑第 1 列到第 9 列,并在第 0 列时启用编辑第 1 列到第 9 列......如何做到这一点? 最佳答案 您需要重写 Ta
更改单元格值后,我的 JTable 不刷新。我可以双击单元格并更改其值,但是当我按“确定”或单击单元格外时,该值将重置为前一个值,但不会更新表格。这是我的自定义表模型的代码,我不知道如何更新数据库,因
我试图重写 DefaultTableModel 类的 isCellEditable 方法以使我的表格单元格不可编辑。我正在尝试通过使用匿名内部类来实现此目的, 但是,表格单元格仍然可编辑,并且在尝试调
我想编辑一个特定的单元格,因此我在此之后编辑 isCellEditable 方法,当我调用 isCellEditable 组件时,它的编辑值为 true,但它不会编辑那个特别的。请帮帮我。按原样将行值
我在使用 JTable 和 isCellEditable 时遇到问题。我使用两个数组来使单元格可编辑: private boolean cEFilm[]={true,true,true,true,fa
为什么我在方法中使用此代码: DefaultTableModel model = new DefaultTableModel(null, vett){ public boolean isCel
我有一个像上面这样的表格。最初,除了按钮列之外的所有单元格都是不可编辑的。我使用自定义 TableModel 创建了表格。我在自定义 TableModel 中的 isCellEditable 如下所示
我的 AbstractTableModel 的 isCellEditable(row, column); 方法被覆盖,我检查过当我点击有问题的单元格时它返回 true 或 false 正确,但是,它不
我是一名优秀的程序员,十分优秀!