- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,有一个 Jtable,其中有一列具有特定的单元格渲染模型。这种模型,只是在这一列中放置按钮而不是文本数据。
表格的第一个显示效果很好。当我使用更改内容顺序的函数时,仍会为此列调用模型(通过调用 fireTableDataChanged() 强制重绘)。
现在,我希望删除键删除表中的当前行。为此,我使用以下代码:
public void keyTyped(KeyEvent arg0) {
if (arg0.getKeyChar() == KeyEvent.VK_DELETE) {
int currentRow = this.m_data.currentRow();
if (currentRow >= 0) {
this.m_data.deleteRow(currentRow);
System.out.println("mise a jour après destruction de ligne");
this.fireTableRowsDeleted(currentRow, currentRow);
}
}
}
(m_data 是我的表模型)。令人惊讶的是,数据已更新(行已消失),但第一列为空。我的跟踪显示仅调用了 getValueAt() 。未调用 getTableCellRendererComponent()。
我尝试触发 fireTableDataChanged() 而不是 fireTableRowsDeleted(),但它是同一件事。因此它似乎与火功能无关。您知道这个问题的根源以及解决方法吗?
提前致谢。
最佳答案
这是我们用于表模型的代码。你可以使用它。如您所见,它非常简单干净。
public abstract class BeanTableModel<B> extends ArrayList<B>
implements TableModel {
private List<TableModelListener> listeners = new ArrayList();
private TableModelAttributeList attributeList;
public BeanTableModel() {
super();
}
public BeanTableModel(Object[][] attributes) {
super();
this.attributeList = new TableModelAttributeList(attributes) {
};
}
public TableModelAttributeList getAttributeList() {
return attributeList;
}
public final void setAttributeList(TableModelAttributeList attributeList) {
this.attributeList = attributeList;
}
@Override
public final int getRowCount() {
return size();
}
@Override
public final int getColumnCount() {
if (attributeList != null) {
return attributeList.size();
} else {
return 0;
}
}
@Override
public final String getColumnName(int columnIndex) {
if (attributeList != null) {
return attributeList.getColumnName(columnIndex);
} else {
return null;
}
}
@Override
public final Class<?> getColumnClass(int columnIndex) {
if (attributeList != null) {
return attributeList.getColumnClass(columnIndex);
} else {
return Object.class;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public final Object getValueAt(int rowIndex, int columnIndex) {
try {
if (rowIndex >= 0) {
return (attributeList != null) ? attributeList.getValue(this.get(
rowIndex), columnIndex) : null;
} else {
return get(rowIndex);
}
} catch (Exception ex) {
Logger.getLogger(BeanTableModel.class.getName()).log(Level.SEVERE,
null, ex);
return null;
}
}
@Override
public final boolean add(B e) {
boolean result = super.add(e);
if (result) {
fireListeners();
}
return result;
}
@Override
public final boolean addAll(Collection<? extends B> c) {
boolean result = super.addAll(c);
if (result) {
fireListeners();
}
return result;
}
public final void change(Collection<? extends B> c) {
super.clear();
super.addAll(c);
fireListeners();
}
@Override
public final boolean addAll(int index, Collection<? extends B> c) {
boolean result = super.addAll(index, c);
if (result) {
fireListeners();
}
return result;
}
@Override
public final void clear() {
super.clear();
fireListeners();
}
@Override
public final boolean remove(Object o) {
boolean result = super.remove(o);
if (result) {
fireListeners();
}
return result;
}
@Override
public final boolean removeAll(Collection<?> c) {
boolean result = super.removeAll(c);
if (result) {
fireListeners();
}
return result;
}
@Override
protected final void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
fireListeners();
}
@Override
public final boolean retainAll(Collection<?> c) {
boolean result = super.retainAll(c);
if (result) {
fireListeners();
}
return result;
}
@Override
public final B remove(int index) {
B b = super.remove(index);
fireListeners();
return b;
}
@Override
public final void add(int index, B element) {
super.add(index, element);
fireListeners();
}
@Override
public final B set(int index, B element) {
B b = super.set(index, element);
fireListeners();
return b;
}
@Override
public final void trimToSize() {
super.trimToSize();
fireListeners();
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
//Do Nothing
}
@Override
public final void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
@Override
public final void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public final void fireListeners() {
TableModelEvent evt = new TableModelEvent(this);
for (TableModelListener listener : listeners) {
listener.tableChanged(evt);
}
}
public final ArrayList<B> serialize() {
return new ArrayList<B>(this);
}
}
这是关于格式及其解释方式的:
public abstract class TableModelAttributeList {
public static final int COLUMN_NAME = 0;
public static final int CLASS = 1;
public static final int ATTRIBUTE_NAME = 2;
public static final int FORMAT = 3;
public static final int REPLACE = 4;
private final Object[][] attributes;
private final Pattern[] patterns;
public TableModelAttributeList(Object[][] attributes) {
this.attributes = attributes;
patterns = new Pattern[attributes.length];
for (int i = 0, size = attributes.length; i < size; i++) {
if (attributes[i][REPLACE] != null) {
patterns[i] = Pattern.compile((String) attributes[i][FORMAT]);
}
}
}
public final String getColumnName(int column) {
return (String) attributes[column][COLUMN_NAME];
}
public final Class<?> getColumnClass(int column) {
return (Class<?>) attributes[column][CLASS];
}
public final int size() {
return attributes.length;
}
public final Object getValue(Object bean, int column) throws
Exception {
try {
Object value = null;
if (attributes[column][ATTRIBUTE_NAME] == null) {
return "";
}
if (attributes[column][ATTRIBUTE_NAME].equals("this")) {
return bean;
} else {
try {
value = PropertyUtils.getProperty(bean,
(String) attributes[column][ATTRIBUTE_NAME]);
} catch (NullPointerException ex) {
return "";
} catch (NestedNullException ex) {
return "";
}
}
if (value == null) {
return null;
} else if (patterns[column] != null) {
Matcher matcher = patterns[column].matcher(String.valueOf(value));
if (matcher.find()) {
return matcher.replaceAll(
(String) attributes[column][REPLACE]);
} else {
return null;
}
} else if (value instanceof Date) {
if (attributes[column][FORMAT] != null) {
DateFormat format = new SimpleDateFormat(
(String) attributes[column][FORMAT]);
return format.format((Date) value);
} else {
return value;
}
} else if (attributes[column][FORMAT] != null) {
return String.format(
(String) attributes[column][FORMAT], value);
} else {
return value;
}
} catch (IllegalAccessException ex) {
String message = "The property named '"
+ (String) attributes[column][ATTRIBUTE_NAME]
+ "' has a private getter method";
throw new Exception(message, ex);
} catch (InvocationTargetException ex) {
String message = "An exception has ocurred while retrieving value for bean property '"
+ (String) attributes[column][ATTRIBUTE_NAME] + "'";
throw new Exception(message, ex);
} catch (NoSuchMethodException ex) {
String message = "The bean doesn't have a property named '"
+ (String) attributes[column][ATTRIBUTE_NAME] + "'";
throw new InvalidModelAttributesException(message, ex);
}
}
}
这就是创建表模型的方式:
public class SelectEmployeeTableModel extends BeanTableModel<Empleados> {
public static final String NOMBRE = "Nombre";
public static final String DEPARTAMENTO = "Departamento";
public static final String FECHA_BAJA = "FechaBaja";
public SelectEmployeeTableModel() {
super(new Object[][]{
{NOMBRE , Object.class, "nombreCompleto" , null, null},
{DEPARTAMENTO , Object.class, "departamentoId.nombre" , null, null},
{FECHA_BAJA , Object.class, "fechaBaja" , null, null}
});
}
}
第一列是可见列名称,第二列是数据类型(如果要显示复选框,请将其替换为 Boolean.class),第三列是不带“get”前缀的名称,如下所示它使用反射,第四个是格式(对于日期,它可以是“dd/MM/yyyy”或十进制数的“$%.2f”),第五个是用正则表达式替换。
然后在您想要使用它的面板中执行以下操作:
jtable.setModel(new SelectEmployeeTableModel());
如果您需要更改表模型中的数据
model.change(collectionName);
如果您只想出于某种原因刷新它,您可以这样做
model.fireListeners();
并且渲染器从未失败过。至少您没有在实体中正确设置 setter/getter 。
如果您有任何疑问,请不要害怕询问!祝你有美好的一天。
关于java - 从 keyTyped 发送火灾事件后未调用 getTableCellRendererComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288951/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!