- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JTable,其中一列包含不同的对象类型。每种类型都有自己的渲染器和编辑器(getDefaultRenderer(Number.class)、我自己的日期渲染器/编辑器等)。
但是,我的表模型(我重写 DefaultTableModel)中的方法 setValueAt(Object value, int row, int col)
始终将 String 作为 value
。因此,尽管有不同的编辑器,我无法在不解析字符串的情况下更新行,这不是一个好主意,因为我的表将来应该可以轻松处理其他对象类型。
getValueAt(int row, int col)
不会将对象转换为字符串。我查了一下。这种行为的原因是什么?
编辑:下面的代码。只有 boolean 单元格编辑器似乎可以正常工作。
import java.awt.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class Tabela {
public static void main(String[] args){
JFrame fr = new JFrame("tabela");
fr.setSize(600, 400);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// custom renderer and editor for Date
final DateCellEditor dateEditor = new DateCellEditor();
final DateCellRenderer dateRenderer = new DateCellRenderer();
final TableModel model = new TableModel();
JTable table = new JTable(model){
public TableCellEditor getCellEditor(int row, int col){
if (model.getValueAt(row, col) instanceof Boolean)
return getDefaultEditor(Boolean.class);
else if (model.getValueAt(row, col) instanceof Number)
return getDefaultEditor(model.getValueAt(row, col).getClass());
else if (model.getValueAt(row, col) instanceof Date)
return dateEditor;
else return getDefaultEditor(Object.class);
}
public TableCellRenderer getCellRenderer(int row, int col){
if (model.getValueAt(row, col) instanceof Boolean)
return getDefaultRenderer(Boolean.class);
else if (model.getValueAt(row, col) instanceof Number)
return getDefaultRenderer(model.getValueAt(row, col).getClass());
else if (model.getValueAt(row, col) instanceof Date)
return dateRenderer;
else
return getDefaultRenderer(Object.class);
}
};
JScrollPane sc = new JScrollPane(table);
fr.getContentPane().add(sc);
fr.setVisible(true);
}
public static class TableModel extends DefaultTableModel{
// data in first column
private ArrayList<String> names = new ArrayList<String>();
// data in second column - can by any object
private ArrayList<Object> values = new ArrayList<Object>();
public TableModel(){
// insert example data
names.add("string value");
values.add("some string");
names.add("number value");
values.add(new Integer(12345));
names.add("Boolean value");
values.add(new Boolean(false));
names.add("Double value");
values.add(new Double(10.5));
names.add("Date object");
values.add(new Date(System.currentTimeMillis()));
}
public void setValueAt(Object value, int row, int col){
values.set(row, value);
fireTableCellUpdated(row, col);
}
public Object getValueAt(int row, int col){
if (col==0)
return names.get(row) + " ["+values.get(row).getClass().getSimpleName()+"]";
else return values.get(row);
}
public int getRowCount(){
if (values==null) return 0;
else return values.size();
}
public int getColumnCount(){
return 2;
}
public boolean isCellEditable(int row, int col){
return col==1; // only column 2 is editable
}
public Class<?> getColumnClass(int col){
switch(col){
case 0:
return String.class;
default:
return Object.class;
}
}
}
// My own renderer and editor for Date type
protected static class DateCellRenderer extends DefaultTableCellRenderer{
private static DateFormat format = new SimpleDateFormat("dd-MM-y HH:mm:ss");
public static void setDateFormat(String f){
format = new SimpleDateFormat(f);
}
public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (value instanceof Date){
value = format.format(value);
}
else if(value instanceof Calendar)
{
Calendar dateValue = (Calendar) value;
value = format.format(dateValue.getTime());
}
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (c instanceof JComponent){
JComponent jc = (JComponent) c;
jc.setToolTipText("dd-MM-y HH:mm:ss");
}
return c;
}
}
protected static class DateCellEditor extends DefaultCellEditor{
private static DateFormat format = new SimpleDateFormat("dd-MM-y HH:mm:ss");
private JFormattedTextField textField = new JFormattedTextField(format);
public DateCellEditor(){
super(new JFormattedTextField(format));
}
public void setDateFormat(String f){
format = new SimpleDateFormat(f);
textField = new JFormattedTextField(format);
}
public Component getTableCellEditorComponent (JTable table, Object value, boolean isSelected, int row, int column)
{ System.out.println("editor: "+value.getClass());
if (value instanceof Date){
value = format.format(value);
}
else if(value instanceof Calendar)
{
Calendar dateValue = (Calendar) value;
value = format.format(dateValue.getTime());
}
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}
}
}
最佳答案
从您的代码示例中(立即)有许多值得关注的事情。
首先,不需要覆盖 getCellEditor
和getCellRenderer
JTable
的方法.
我对你这样做的方式遇到的最大问题是,如果模型的值是null
怎么办? ?
您可以修改单元格编辑器并呈现给定的 Class
通过使用setDefaultEditor(Class, TableCellEditor)
和setDefaultRenderer(Class, TableCellRenderer)
方法代替。
从您的表模型中,您应该返回所有适当的 Class
所需列的类型(来自 getColumnClass
)。这里的假设是给定列具有相同类型 Class
值。
但是,问题的原因在于编辑器。
如果示例编辑器可以作为引用,那么您将从 DefaultCellEditor
进行扩展。 ,它只使用 JTextField
因为它是编辑器。这意味着getCellEditorValue
将返回String
,这就是你的 setValueAt
的原因方法传递一个 String
值。
有多种选择。
TableCellEditor
使用了更合适的编辑器(例如 JSpinner
或 JCheckBox
)getCellEditorValue
转换String
值从默认编辑器改为更合适的 Object
类型。我更喜欢选项 1,因为它代表了适合的表单和编辑器中的基础数据,并且可以避免处理错误解析带来的麻烦。
我会仔细看看 How to use tables并密切关注自定义编辑器的部分
关于java - TableModel 中的 setValueAt 总是获取一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985474/
我正在寻找类似于Java Swing TableModel的JavaScript MVC表格小部件 我还想要两种模型,一种完全本地的,一种远程的(XMLHttpRequest) 我还希望 View 接
我正在尝试创建一个类似于下面的模型的 JTable: 绿色角基本上是红色列标题和行标题的缓冲区空间。单元格不需要渲染成图中的颜色;但是,它们需要与表中其他“白色”单元格区分开来。 该表也不可编辑或选择
更新: 我找到了 @MadProgrammer 的答案,它成功了! Updating JTable on button click 基本上,您将一个refresh()方法添加到您的TableModel
在我的程序中,我希望在 JTable 中显示一些数据。我有一个包含数据的类,因此在 JTable 中呈现它的最简单方法似乎是扩展我的类,以便它实现 TableModel 接口(interface)并将
我有一个单独的类,它实现用于 JTable 的 TableModel 接口(interface)。我有一个 boolean 列,以一列复选框的形式呈现,我想知道如何通知外部对象某些值需要更新?如果我将
新手寻求帮助:-) 我正在开发一个小项目,以熟悉 Java 桌面开发和数据库连接。 所附代码在实例化后为我提供了一个空的 TableModel,因此 JFrame 中没有显示任何数据。测试类是使用 T
您可以创建表格模型并将其添加到表格中 TableModel tm = new TableModel(); JTable table = new JTable(tm); 但是,如果我初始化一个表 JTa
我正在将数据从 DAO 获取到 GUI 级别。 当我想加载表时,我得到一个空表,仅包含单击的数据库符号的正确行数: 加载我使用的元素: playlistTable.addMouseListener(n
在java swing表模型中,我们能够触发表更改、添加、删除等。我想知道如果组件不可见,这些方法调用是否会很昂贵? 例如,另一个窗口覆盖了它。或者它位于非 Activity 选项卡中。 最佳答案 为
我有一个用于存储数字的 JTable。我实际上只使用表格来查看/排序。即使某些列可能全部都是整数或长整型,为这些列提供 Double 类是否会导致失败(除了可能需要分配更多空间之外)。我可以解析这些数
我正在尝试获取 JTable 的已排序 TableModel,这是通过以下简单的 regex 标准完成的: try { TableRowSorter sortRow = new TableRo
在下面的示例中,一个窗口显示一个表格,其中包含窗口本身的宽度。调整窗口大小时,其宽度值反射(reflect)了当前的真实情况。 这怎么可能? Swing 如何通知表,它应该重新请求模型?或者模型正在接
我有一个使用 setAutoCreateRowSorter(true) 的 JTable 和一个附加的 RowSorterListener,如下所示,因为我需要在我的应用程序的其他地方对某种 JTab
我有课; public class A extends AbstractTableModel { ... } 我使用 ResultSetMetaData 构建 TableModel 以匹配数据库中的
我需要将繁重的数据集加载到 QTableView 中。数据集在内存中不小于 700Mb,我不想将其全部加载到内存中。 QSqlQueryModel 对我来说并不理想,原因有两个 - 它不可编辑,也不是
我的 TableModel实现通常位于 ArrayList以实现高效的随机访问性能。然而,ArrayList的 remove(int)实现看起来相当低效,因为它涉及制作 System.arrayCop
我有一个简单的 Java 桌面应用程序,它显示带有自定义 TableModel 的 JTable。 在 boolean 变量的基础上,我想显示一个具有不同列的表。但我无法做到这一点。 This is
我面临 JTable 和与其关联的 TableModel 的问题。这里的问题是,假设如果我在 JTable 上进行行选择,我想从 TableModel 获取特定的行对象并将其传递到某个地方。有谁知道如
我创建了一个包含人员列表的 JTable。一个 Person 总是可以包含另一个 Person(或者可能是它自己)。因此,用户可以单击该列,然后会出现一个 JComboBox。此 JComboBox
我有一个jTable,它根据一些jComboBox加载搜索结果。我使用 DefaultTableModel 来实现此目的,对于其他 jTable,我使用 TableModel。 搜索后,jTable
我是一名优秀的程序员,十分优秀!