- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 JTable(类型 AbstractTableModel)中编辑的行保存到文件中。我不知道该怎么做;或者可以使用 ObjectOutput 和 InputStream。
此外,我想在保存时从另一个 JTable 加载它。
为了给你一个更好的了解,我正在做一个EPOS系统,用户可以编辑行数据(数量),当程序执行时,发现数量不为零,它会保存整行(与当前详细信息)到文件中。这样用户就可以拥有已下订单的记录(针对 EPOS 和库存中的销售功能)。
当用户单击“确认”按钮时,有望触发保存部分。
有人可以帮我吗?谢谢
最佳答案
如果您阅读 JTable
API,您会发现它建议您使用 XMLEncoder
进行长期存储。
I am trying to save edited rows from a JTable (type AbstractTableModel)
您没有使用 AbstractTableModel。 AbstractTableModel不提供任何数据存储。您正在使用扩展 AbstractTableModel 的 TableModel。假设您使用的是 DefaultTableModel
,这里是一个允许您使用 XMLEncoder 和 XMLDecoder 的示例:
// Following code is a more complete version of:
// http://stackoverflow.com/q/26250939/131872
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;
public class DefaultTableModelPersistenceDelegateTest
{
private File file = new File("TableModel.xml");
private final JTextArea textArea = new JTextArea();
private final String[] columnNames = {"Column1", "Column2"};
private final Object[][] data =
{
{"aaa", new Integer(1)},
{"bbb\u2600", new Integer(2)}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames);
private final JTable table = new JTable(model);
public JComponent makeUI()
{
model.setColumnCount(5);
JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
sp.setResizeWeight(.3);
sp.setTopComponent(new JScrollPane(table));
sp.setBottomComponent(new JScrollPane(textArea));
JPanel p = new JPanel();
p.add(new JButton(new AbstractAction("XMLEncoder")
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
XMLEncoder xe = new XMLEncoder(os);
xe.setPersistenceDelegate(DefaultTableModel.class, new DefaultTableModelPersistenceDelegate());
xe.writeObject(model);
xe.close();
Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
textArea.read(r, null);
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}));
p.add(new JButton(new AbstractAction("XMLDecoder")
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
InputStream is = new BufferedInputStream( new FileInputStream( file ));
XMLDecoder xd = new XMLDecoder(is);
model = (DefaultTableModel)xd.readObject();
table.setModel(model);
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}));
p.add(new JButton(new AbstractAction("clear")
{
@Override
public void actionPerformed(ActionEvent e)
{
model = new DefaultTableModel();
table.setModel(model);
}
}));
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(sp);
pnl.add(p, BorderLayout.SOUTH);
return pnl;
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
@Override public void run()
{
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new DefaultTableModelPersistenceDelegateTest().makeUI());
f.setSize(420, 340);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
// See following link for more information on Using XMLEncoder:
// http://www.oracle.com/technetwork/java/persistence4-140124.html
class DefaultTableModelPersistenceDelegate extends DefaultPersistenceDelegate
{
// Initially creates an empty DefaultTableModel. The columns are created
// and finally each row of data is added to the model.
@Override
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder)
{
DefaultTableModel model= (DefaultTableModel)oldInstance;
// Create XML to restore the column names
Vector<String> columnNames = new Vector<String>(model.getColumnCount());
for (int i = 0; i < model.getColumnCount(); i++)
{
columnNames.add( model.getColumnName(i) );
}
Object[] columnNamesData = new Object[] { columnNames };
encoder.writeStatement(new Statement(oldInstance, "setColumnIdentifiers", columnNamesData));
// Create XML to restore row data
Vector row = model.getDataVector();
for (int i = 0; i < model.getRowCount(); i++)
{
Object[] rowData = new Object[] { row.get(i) };
encoder.writeStatement(new Statement(oldInstance, "addRow", rowData));
}
}
}
class DefaultTableModelPersistenceDelegate2 extends DefaultPersistenceDelegate
{
// Initially creates a DefaultTableModel with rows and columns. Then the
// columns are reset and proper names are used. Finally data is set for each
// cell in the model.
@Override
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder)
{
super.initialize(type, oldInstance, newInstance, encoder);
DefaultTableModel model= (DefaultTableModel)oldInstance;
// Create XML to restore the column names
Vector<String> columnNames = new Vector<String>(model.getColumnCount());
for (int i = 0; i < model.getColumnCount(); i++)
{
columnNames.add( model.getColumnName(i) );
}
Object[] columnNamesData = new Object[] { columnNames };
encoder.writeStatement(new Statement(oldInstance, "setColumnIdentifiers", columnNamesData));
// Create XML to reset the value of every cell to its value
for (int row = 0; row < model.getRowCount(); row++)
{
for (int col = 0; col < model.getColumnCount(); col++)
{
Object[] o = new Object[] {model.getValueAt(row, col), row, col};
encoder.writeStatement(new Statement(oldInstance, "setValueAt", o));
}
}
}
}
如果您没有使用 DefaultTableModel,那么您将需要创建自己的 PersistenceDelegate。
关于java - 如何将 AbstractTableModel 保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583219/
添加一行并调用 fireTableRowInserted() 还是添加所有行然后调用 fireTableDataChanged() 是个好主意? 最佳答案 如果您所做的只是添加新行,最好添加所有行,然
我正在尝试用 VCID 和 VCIDBACKUP 的空值替换“Dont Have”。这是我的代码: if (controladorExcel == false) { Writa
我有这个表模型,并且我插入以这种方式调用的值: lista.setModel(new SimpleTableModel(dados, colunas)); lista 是 JTable 型号:
我的表格模型在更新其中打印的数据时遇到问题。 我有作为表模型的 AgendaTableModel 类和作为主 UI 的 Screen 类,当我按下“Listar Contatos”按钮时,表模型应该出
我正在开发一个小程序,它应该在 JTable 中显示食谱。一切似乎都工作正常,我遇到的唯一问题是我无法初始化应该正确保存数据的对象。这是让我头疼的类(class): class RecipeTable
我有一个类,它实际上是一些数据的列表,它扩展了AbstractTableModel。此类中的数据存储在线程安全的数组列表中。 但是,如果我想添加一些数据,可以说我在扩展 AbstractTableMo
我引用了很多方法。即fireTableCellUpdated 的有效方法。但其实我还是不申请。 DETA值更新后如何使表内容更新。 方法我调用GJJ方法实现。虽然更新了但是出现了很多新的窗口。这不是我
我找到的例子: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm显示如何创建具有指定列(按钮)的 JTab
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有两个类。第一个类mainWindow扩展了JFrame,其中我有一个JTable table1。在我的第二堂课中,我需要拿到这张 table 。当我在 mainWindow 中生成 getter
在设置特定外观后序列化扩展 AbstractTableModel 的类会导致 java.io.NotSerializedException: com.sun.java.swing.plaf.windo
我有一个扩展 JTable 的类,我想将其设置为 AbstractTableModel,但我了解其可能性的唯一方法是调用 使用 super 的 JTable 构造函数。 但是,我需要在调用构造函数之前
我设法潜伏并找到一个可以替代的好类(class) JTable(Object[][] data, Object[] columnNames)与 RowTableModel(List modelData
嘿。我正在尝试使用 AbstractTableModel 构建一个简单的 JTable,但即使我使用了 JScrollPane,列名称也不会出现。 public class TableModel ex
我有一些数据从我的数据库加载并作为公共(public)静态列表存储在另一个类中,我无法访问 MyTableModel 类中的数据以在 jtable 中存储和查看它们...还有许多其他方法可以用我的数据
是否可以动态更改 AbstractTableModel 列名称? 我正在尝试实现setColumnName(0, "Speed rpm")方法。 public class MyModel extend
我想根据我使用 AbstractTableModel 指定的列从数据库的表中提取数据。表中有 8 列,但只想显示 8 列中的 3 列。 例如: 数据库具有以下列:ID、First_Name、Last_
我已经实现了一个 AbstractTableModel 对象,它是一种时间表。我想将当时将通过使用方法教授的主题写入单元格(因此我不想将行声明为已编译)。我能怎么做?这是我的 AbstractTabl
我正在尝试将 JTable(类型 AbstractTableModel)中编辑的行保存到文件中。我不知道该怎么做;或者可以使用 ObjectOutput 和 InputStream。 此外,我想在保存
我正在制作一个 Swing 项目。可能太大了,无法粘贴到这里。我什至尝试记录 table.getSelectedRow() 并且它显示了正确的索引。但不知何故,当我按下删除按钮时,这会导致在此类中调用
我是一名优秀的程序员,十分优秀!