Tag: abstracttablemodel

为什么JTable在渲染时使TableModel不可序列化?

所以最近我在这里为我们开发了一个工具来配置某些应用程序。 它不需要真正棒极了,只需要生成一些SQL脚本的基本工具,并创建几个XML文件。 在此期间,我使用自己的AbstractTableModel实现创建了一系列JTable对象。 在我构建了所有内容之后,我开始使用AbstractTableModel测试保存和加载(仅使用ObjectStreamWriter写入磁盘)序列化失败。 我几乎整天都在弄清楚发生了什么。 当我尝试序列化它们时,我会在java.lang.reflect.Constructor上得到一个NotSerializableException。 我不知道这是什么,因为我的表模型只包含可序列化的实体,我附加的所有监听器也是可序列化的,父类也是可序列化的。 经过大量的挖掘和一些有用的post后,我发现当你将一个TableModelListener添加到一个AbstractTableModel实现时,除了你添加的一个监听器之外还添加了另一个监听器,类型为javax.swing.event.TableModelListener,它不是t serializable(参见http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TableModelListener.html的接口,我不知道实现)。 编辑模型不会添加这个非可序列化的侦听器,JTable会这样做。 我的问题基本上是,为什么这个对象会在内部添加自己的非可序列化对象,从而否定事实上它实际上实现了Serializable? 这是我应该报告的错误吗? 仅供参考我的工作就是简单地删除所有的监听器,序列化,然后重新添加监听器。 反序列化时我只需要添加我创建的那个,模型再次创建另一个。 编辑尝试使用通过调用setValueAt()方法提供的序列化程序类序列化此模型。 import java.io.Serializable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; public class BlankTableModel extends AbstractTableModel implements Serializable { /** * */ private static final long serialVersionUID = 6063143451207205385L; public BlankTableModel() { this.addTableModelListener(new InnerTableModelListener()); } @Override public void setValueAt(Object o, int x, int […]

不要更新JTable

我找到了更新数据的示例,但它使用了DefaultTableModel。 当我创建自己的TableModel和我自己的数据类时,当我将数据添加到JTable时它不会更新。 如何向TableModel添加监听器? 这是我的代码: package by; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.LinkedList; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; public class DialogEg { private static void createAndShowGui() { MainWin mainPanel = new MainWin(); JFrame […]

一起使用TableCellRenderer和getColumnClass

当我将getcolumn类添加到我的abstracttablemodel时,我无法使用我的自定义TableCellRenderer来设置背景颜色。 (我用它来排序,对齐数字列) public Class getColumnClass(int columnIndex) { Object o = getValueAt(0, columnIndex); if (o == null) { return Object.class; } else { return o.getClass(); } } 这充满了我的代码。 import java.awt.*; import java.text.DecimalFormat; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.table.*; public class DemoRenderer extends JFrame { public static void main( String[] args ) { DemoRenderer frame = […]

使用JComboBox更改/更新JTable内容(类别)

我的JTable有问题。 我的JTable显示数据库的内容。 一个数据库表具有名称类别。 每个类别都显示在JComboBox中。 如果我点击某个类别,它应该更新表格内容。 这是我的代码短片,所以它更容易帮助我。 代码应该是可运行的: (TestClass – Main) package test; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class TestClass implements ActionListener{ String[] header = {“head”, “head”, “head”}; Object[][] data = {{Boolean.FALSE, “text”, “text”}, {Boolean.FALSE, “text”, “text”}, {Boolean.FALSE, “text”, “text”}}; […]

AbstractTableModel getValueAt性能

我是JTable新手,也许我不明白。 假设我有1000个Students ArrayList ( id, name, surname, age )。 我想向JTable展示所有学生。 据我所知,我必须创建extends AbstractTableModel并将StudentTableModel设置为JTable StudentTableModel 。 因此,我们可以将StudentTableModel视为ArrayList和表之间的“适配器”。 在互联网上,我发现了getValueAt这种示例实现: public Object getValueAt(int row, int col) { Student student = arrayList.get(row); switch (col) { case 0: return student.getId(); case 1: return student.getName(); case 2: return student.getSurname(); case 3: return student.getAge(); } } 问题是,有1000个学生(行)和4个字段(列),我们将运行此开关4000次。 请解释我的错误或告诉我们更好的解决方案。

创建TableModel并动态填充jTable

我想将读取lucene索引的结果存储到jTable中,这样我就可以通过不同的列对它进行排序。 从索引我正在阅读不同频率度量的术语。 表列是这些:[string term] [int absFrequency] [int docFrequency] [double invFrequency] 所以我在AbstractTableModel中我可以定义列名,但我不知道如何使用以下方法得到Object [] []数据: public static void FrequencyMap(Directory indexDir) throws Exception { ListredoviLista = new ArrayList(); //final Map map = new TreeMap(); ListtermList = new ArrayList(); IndexReader iReader = IndexReader.open(indexDir); FilterIndexReader fReader = new FilterIndexReader(iReader); int numOfDocs = fReader.numDocs(); TermEnum terms = fReader.terms(); while (terms.next()){ Term […]

Jtable没有使用我的abstracttablemodel进行更新

我是编程新手,正在完成我的第一份学校作业。 我写了一个gui,接受输入并输出添加到jpaddedpane的jtable中的数据。 当表格首次出现时,它会显示所有正确的数据。 但是当我输入新输入时,表格不会更新。 我是alsmot积极的问题在于我的AstractTableModel的实现。 有人可以看看并尽快为我纠正吗? 提前致谢。 PS。 nh,vh,hNam,proc_1和proc_分别是整数,字符串,整数,字符串和字符串数组。 它们保存要在表格中显示的数据。 public class TableModel extends AbstractTableModel { int numRows; String colNames[] = { “NH”, “Horse Names”, “VH”, “Proc. I”, “Proc. II” }; Object[][] obj; TableModel() { super(); numRows = fnh; obj = new Object[fnh][5]; for( int i = 0; i < fnh; i++ ) { for […]

JTable可点击列排序:排序对单元格内容进行排序,但不更新单元格格式?

我有一个可排序的JTable设置为使用AbstractTableModel的自定义扩展。 但是,这个表的某些行为是我所期望的,我想知道如何解决这个问题。 我将JTable设置为可排序使用: thisJTable.setAutoCreateRowSorter(true); 这允许我按预期单击列标题对表进行排序。 但是,我发现当我通过单击列标题对表进行排序时,我的行的格式(背景和前景色)也没有排序。 我根据它们包含的值设置了这些行的颜色编码。 当我按列标题排序时,给定行NUMBER的格式保持不变(尽管之前在该行中的内容已移动)。 通过覆盖JTable的默认prepareRenderer调用来设置行的颜色: thisTable = new JTable(thisModel){ //Set up custom rendering – Sets background color of row to correct value public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); CustTableModel thisModel = (CustTableModel) getModel(); c.setBackground(thisModel.getRowBackgroundColor(row)); c.setForeground(thisModel.getRowForeColor(row)); return c; } }; 有没有更好/不同的方法来解决这个问题? 我应该使用不同的方法来进行渲染吗?这种方法会更新某种类型的JTable渲染吗? 或者我是否想要编写自己的排序方法? […]

Jtable具有不同类型的单元格,具体取决于数据类型

如何根据特定行显示的输入类型实现具有不同类型的单元格编辑器的JTable? 例如 一些行可以是复选框(对于布尔类型) 有些行可能是combobox(如果我想提供一组固定的选项可供选择) 某些行可以是文本字段(如果我允许任意数据)。 目前我已经实现了AbstractTableModel ,它从我的对象中获取一组自定义字段对象,并向表中添加行。 我想通过设置特定类型的单元格来进一步自定义我的表格。 我可以根据行包含的字段类型确定要使用的单元格类型。 表模型是在运行时动态创建的。

使用AbstractTableModel从JTable中删除行

我想使用按钮从AbstractTableModel删除JTable中的选定行。 下面的代码适用于DefaultTableModel: … MyTableModel mtb; … private String[]…. private Object[][]… … JTable table = new JTable(mtb) JButton delete; … public void actionPerformed(ActionEvent e) { if(e.getSource().equals(delete)) { if(table.getSelectedRow()<0) { JOptionPane.showMessageDialog(this,"Select row"); } else { mtb.removeRow(table.getSelectedRow()); } } } 但它不适用于AbstractTablemodel 。 我的代码有点乱,所以这里是来自oracle页面的java示例 ,可以使用: 谢谢!