我创建了一个简单的GUI,其中包括一个JTable。这张桌子可能被保存了
此时,保存函数按预期工作,当在保存目录中查找时,我可以看到表对象存储在文件中。
但是,当我尝试从文件加载表时,GUI从不显示加载的表。调用actionlistener函数,因为我有一个系统。输出“数据已加载”,但表格从不显示更新的数据。
我已尝试调用repaint(),但无效。如果有人能让我知道我可能做错了什么,我将不胜感激。
看一些代码
import javax.swing.*;
import java.awt.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.table.*;
import java.awt.event.*;
public class Save3 extends JFrame implements ActionListener{
public int PADDING = 10;
public JMenuItem menuNew;
public JMenuItem menuOpen;
public JMenuItem menuSave;
public JMenuItem menuExit;
public JPanel container;
public DefaultTableModel model;
public JScrollPane scrollPane;
public JTable table;
public FileInputStream fis;
public ObjectInputStream in;
public FileOutputStream fos;
public ObjectOutputStream out;
public String filename;
public Save3(){
fis = null;
in = null;
fos = null;
out = null;
filename = "test.ref";
initGUI();
}
public void initGUI(){
setTitle("WIM Reference Data Comparison Tool");
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Menu Bar and Menu Items setup
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
menuNew = new JMenuItem("New");
menuOpen = new JMenuItem("Open");
menuSave = new JMenuItem("Save");
menuExit = new JMenuItem("Exit");
menuNew.addActionListener(this);
menuOpen.addActionListener(this);
menuSave.addActionListener(this);
menuExit.addActionListener(this);
menu.add(menuNew);
menu.add(menuOpen);
menu.add(menuSave);
menu.add(menuExit);
setJMenuBar(menuBar);
container = new JPanel(new BorderLayout());
String[] columnNames = {"", "MotorBike", " Car"};
Object[][] data = { {"Vehicle Summary", new Integer(100), new Integer(200)}, // Header 1: Green
{"Axle Numbers", new Integer(100), new Integer(200)},
{"Axle Code", new Integer(100), new Integer(200)},
{"Axle Distances (cm)", new Integer(100), new Integer(200)},
{"Vehicle Speed (km/h)", new Integer(100), new Integer(200)},
{"Gross Weight", new Integer(100), new Integer(200)},
{"Axle Weight 1", new Integer(100), new Integer(200)},
{"Axle Weight 2", new Integer(100), new Integer(200)},
};
model = new DefaultTableModel(data, columnNames);
table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
add(container);
}
public void setPanel(JTable table){
scrollPane.remove(table);
container.remove(scrollPane);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
repaint();
}
public void actionPerformed(ActionEvent e){
System.out.println("Clicked item!");
// NEW
if(e.getSource() == menuNew){
System.out.println("New File");
}
// SAVE
if(e.getSource() == menuSave){
System.out.println("Save!");
try{
model.fireTableDataChanged();
table = new JTable(model);
fos = new FileOutputStream(filename);
out = new ObjectOutputStream(fos);
out.writeObject(table);
}catch(IOException e3){
e3.printStackTrace();
}
}
if(e.getSource() == menuOpen){
System.out.println("Open!");
JTable table = new JTable();
try{
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
table = new JTable();
table = (JTable) in.readObject();
in.close();
setPanel(table);
System.out.println("data loaded");
}catch(IOException e1){
e1.printStackTrace();
}catch(ClassNotFoundException e2){
e2.printStackTrace();
}
}
if(e.getSource() == menuExit){
System.out.println("Exit!");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
Save3 ex = new Save3();
ex.setVisible(true);
}
});
}
}
在actionPerformed
代码中,导入的表(这是一个新实例)不会添加到容器中。
>
JTable及其XXXTable模型基于向量或对象[]
必须将数据从FileIO
加载到结构中的XxxTableModel
,就像Vector
或Object[]
对XxxTableModel的所有更新必须在EventDispatchThread上完成,否则任何更改都可以在屏幕上看到
新表未添加到任何位置,因此不会显示。试着这样做:
public void actionPerformed(ActionEvent e){
JTable oldTable = table;
// your stuff, loading the table from file
thePanelHoldingYourTable.remove(oldTable);
thePanelHoldingYourTable.add(table);
// if there are other components in that panel, make sure, your table is in the right spot
// maybe refresh your layout by using invalidate()
}
编辑:好的,不建议序列化表,最好只保存表模型。这是您编辑的SSCCE(感谢kleopatra的帮助):
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class Save3 extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
public int PADDING = 10;
public JMenuItem menuNew;
public JMenuItem menuOpen;
public JMenuItem menuSave;
public JMenuItem menuExit;
public JPanel container;
public DefaultTableModel model;
public JScrollPane scrollPane;
public JTable table;
public FileInputStream fis;
public ObjectInputStream in;
public FileOutputStream fos;
public ObjectOutputStream out;
public String filename;
String[] columnNames = {"", "MotorBike", " Car"};
Object[][] data = { {"Vehicle Summary", new Integer(100), new Integer(200)}, // Header 1: Green
{"Axle Numbers", new Integer(100), new Integer(200)}, {"Axle Code", new Integer(100), new Integer(200)}, {"Axle Distances (cm)", new Integer(100), new Integer(200)}, {"Vehicle Speed (km/h)", new Integer(100), new Integer(200)}, {"Gross Weight", new Integer(100), new Integer(200)}, {"Axle Weight 1", new Integer(100), new Integer(200)}, {"Axle Weight 2", new Integer(100), new Integer(200)},};
public Save3() {
fis = null;
in = null;
fos = null;
out = null;
filename = "test.ref";
initGUI();
}
public void initGUI() {
setTitle("WIM Reference Data Comparison Tool");
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Menu Bar and Menu Items setup
JMenuBar menuBar;
JMenu menu;
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
menuNew = new JMenuItem("New");
menuOpen = new JMenuItem("Open");
menuSave = new JMenuItem("Save");
menuExit = new JMenuItem("Exit");
menuNew.addActionListener(this);
menuOpen.addActionListener(this);
menuSave.addActionListener(this);
menuExit.addActionListener(this);
menu.add(menuNew);
menu.add(menuOpen);
menu.add(menuSave);
menu.add(menuExit);
setJMenuBar(menuBar);
container = new JPanel(new BorderLayout());
model = new DefaultTableModel(data, columnNames);
table = new JTable();
table.setModel(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
add(container);
}
public void setModel(DefaultTableModel writeModel) {
table.setModel(writeModel);
}
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked item!");
if (e.getSource() == menuNew) {
System.out.println("New File");
} else if (e.getSource() == menuSave) {
System.out.println("Save!");
try {
fos = new FileOutputStream(filename);
out = new ObjectOutputStream(fos);
table.clearSelection();
table.setModel(new DefaultTableModel());
out.writeObject(model);
table.setModel(model);
} catch (IOException e3) {
e3.printStackTrace();
} finally {
try {
out.close();
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} else if (e.getSource() == menuOpen) {
System.out.println("Open!");
try {
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
DefaultTableModel modelRead = (DefaultTableModel) in.readObject();
setModel(modelRead);
System.out.println("data loaded");
in.close();
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
} else if (e.getSource() == menuExit) {
System.out.println("Exit!");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Save3 ex = new Save3();
ex.setVisible(true);
}
});
}
}
请注意,我使用以下三行序列化模型:
table.setModel(new DefaultTableModel());
out.writeObject(model);
table.setModel(model);
因此,模型在序列化时与表分离。不幸的是,模型也试图序列化它的侦听器(失败)。这就是为什么这一步是必要的。一旦保存,模型就可以再次应用到表中。
所以我下载了一个MathJax包,解压,修改设置,并将文件上传到超文本传输协议域。一年多来,一切都尽可能顺利。 两天前,我将所有文件(包括数据库)复制到一个新域,激活SSL并进行修改。htaccess将所有地址转换为https。除了MathJax“无法加载web字体”之外,这一切都非常适用,每次尝试绘制表达式都会导致10秒的延迟。 Firefox和Chrome都没有在控制台中显示任何类型的错误或失
当我调用下面的代码时,我总是得到 用户的值。Id和密码有效。结果错误总是说“无效令牌”,我没有尽可能地看到它,因为我得到它并立即检查它和它的错误。这只是一个理智测试——我通常通过电子邮件向用户发送令牌,但这也不起作用。 UPDATE 1我在同一个控制器中定义UserManager,如下所示: UPDATE 2这是我的Application ationUserManager代码:
问题内容: 我正在关注有关管道库插件的教程。我制作了一个包含以下文件的存储库: helloWorld.groovy包含: Test.groovy包含: 我安装了所有管道插件,尤其是工作流-cps-global-lib- plugin。然后,我创建了一个新的管道作业,在其中加载了此存储库并将脚本路径设置为Test.groovy。当我运行此作业时,出现以下错误: 为什么helloWorld步骤未定义?
我一直在尝试获得一个示例@Configuration构建工作(在groovy中),所以我可以使用Spring容器触发依赖注入,但我得到的只是关于-javaagent的错误,我似乎无法修复 我有一个这样的beanConfig类 然后,我将调用一个示例类new,并尝试获取spring容器中的注入,在上面的配置类中声明diSource bean “@Configurable(自动装配=自动装配。BY_T
我洛基,在“开始”之后,我遵循https://getbootstrap.com/docs/4.3/layout/overview/的指示(我猜在那个例子中缺少了一些东西) 我说: 链接到头标签中的css文件 但是它不起作用,类“hid-ph-flex”总是在“代码”显示中:无“代码”,火狐调试器警告说:“未知规则或错误读取规则在“包括” 我想我忘了一份文件,有什么帮助吗???
谢谢你的帮助。Haskell看起来很有趣,但如果没有一个好教授的指导和指导,这是一门很难学的语言。我只是想自学这门语言。