当前位置: 首页 > 知识库问答 >
问题:

加载JavaJTable:为什么它不工作?

濮阳弘扬
2023-03-14

我创建了一个简单的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);
        }
    });
}

}

共有3个答案

燕玉堂
2023-03-14

actionPerformed代码中,导入的表(这是一个新实例)不会添加到容器中。

贺栋
2023-03-14

>

  • JTable及其XXXTable模型基于向量或对象[]

    必须将数据FileIO加载到结构中的XxxTableModel,就像VectorObject[]

    对XxxTableModel的所有更新必须在EventDispatchThread上完成,否则任何更改都可以在屏幕上看到

  • 怀刚毅
    2023-03-14

    新表未添加到任何位置,因此不会显示。试着这样做:

    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

    • 我只是按照spring的指示将响应发送回特定用户,而不是广播消息。但最终,无法发送回响应消息。 这是我的js代码: 这是控制器: 这是Spring配置: 请帮忙。谢谢提前。 我已经尝试使用@SendToUser,@SendToUser(/队列/resp)和SimpMessagingTem板以及,完全不能响应消息到浏览器。

    • 我洛基,在“开始”之后,我遵循https://getbootstrap.com/docs/4.3/layout/overview/的指示(我猜在那个例子中缺少了一些东西) 我说: 链接到头标签中的css文件 但是它不起作用,类“hid-ph-flex”总是在“代码”显示中:无“代码”,火狐调试器警告说:“未知规则或错误读取规则在“包括” 我想我忘了一份文件,有什么帮助吗???