Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保存桌面应用程序状态?_Java_Swing - Fatal编程技术网

Java 如何保存桌面应用程序状态?

Java 如何保存桌面应用程序状态?,java,swing,Java,Swing,我正在用java创建一个编辑器。我想知道如何在java中保存中间状态? 例如,当用户希望保存在编辑器上所做的更改时,该如何保存,并且应该在以后重新加载 例如,powerpoint应用程序保存为.ppt或.pptx。稍后,同样的.ppt-while也可以打开以获得进一步的版本。我希望我清楚我的要求。带有用户偏好的API;最近编辑的文件,每个文件可能是时间戳+光标位置,GUI设置。带有用户首选项的API;最新编辑的文件,每个文件可能是时间戳+光标位置、GUI设置。要保存JTextPane的内容,您可

我正在用java创建一个编辑器。我想知道如何在java中保存中间状态? 例如,当用户希望保存在编辑器上所做的更改时,该如何保存,并且应该在以后重新加载


例如,powerpoint应用程序保存为.ppt或.pptx。稍后,同样的.ppt-while也可以打开以获得进一步的版本。我希望我清楚我的要求。

带有用户偏好的API;最近编辑的文件,每个文件可能是时间戳+光标位置,GUI设置。

带有用户首选项的API;最新编辑的文件,每个文件可能是时间戳+光标位置、GUI设置。

要保存
JTextPane
的内容,您可以
使用正确的序列化方式将
JTextPane
DefaultStyledDocument
序列化到文件中。当您想再次加载内容时,您可以
反序列化该内容,并将其显示在
JTextPane
上。考虑下面给出的代码:

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class SaveEditor extends JFrame implements ActionListener{
     public static final String text = "As told by Wikipedia\n"
    +"Java is a general-purpose, concurrent, class-based, object-oriented computer programming language."
    + "It is specifically designed to have as few implementation "
    + "dependencies as possible. It is intended to let application developers write once, run anywhere (WORA), "
    + "meaning that code that runs on one platform does not need to be recompiled to run on another. "
    + "Java applications are typically compiled to bytecode (class file) that can run on any Java virtual "
    + "machine (JVM) regardless of computer architecture. Java is, as of 2012, one of the most popular programming "
    + "languages in use, particularly for client-server web applications, with a reported 10 million users.";
    JTextPane pane ;
    DefaultStyledDocument doc ;
    StyleContext sc;
    JButton save;
    JButton load;
    public static void main(String[] args) 
    {
        try 
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    SaveEditor se = new SaveEditor();
                    se.createAndShowGUI();
                }
            });
        } catch (Exception evt) {}
    }
    public void createAndShowGUI()
    {
        setTitle("TextPane");
        sc = new StyleContext();
        doc = new DefaultStyledDocument(sc);
        pane = new JTextPane(doc);
        save = new JButton("Save");
        load = new JButton("Load");
        JPanel panel = new JPanel();
        panel.add(save);panel.add(load);
        save.addActionListener(this);load.addActionListener(this);
        final Style heading2Style = sc.addStyle("Heading2", null);
        heading2Style.addAttribute(StyleConstants.Foreground, Color.red);
        heading2Style.addAttribute(StyleConstants.FontSize, new Integer(16));
        heading2Style.addAttribute(StyleConstants.FontFamily, "serif");
        heading2Style.addAttribute(StyleConstants.Bold, new Boolean(true));
        try 
        {
            doc.insertString(0, text, null);
            doc.setParagraphAttributes(0, 1, heading2Style, false);
        } catch (Exception e) 
        {
            System.out.println("Exception when constructing document: " + e);
            System.exit(1);
        }
        getContentPane().add(new JScrollPane(pane));
        getContentPane().add(panel,BorderLayout.SOUTH);
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent evt)
    {
        if (evt.getSource() == save)
        {
            save();
        }
        else if (evt.getSource() == load)
        {
            load();
        }
    }
    private void save()//Saving the contents .
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Save");
        int returnVal = chooser.showSaveDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file != null)
            {
                FileOutputStream fos = null;
                ObjectOutputStream os = null;
                try
                {
                    fos = new FileOutputStream(file);
                    os = new ObjectOutputStream(fos);
                    os.writeObject(doc);
                    JOptionPane.showMessageDialog(this,"Saved successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
                finally
                {
                    if (fos != null)
                    {
                        try
                        {
                            fos.close();
                        }
                        catch (Exception ex){}

                    }
                    if (os != null)
                    {
                        try
                        {
                            os.close();
                        }
                        catch (Exception ex){}

                    }
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    private void load()//Loading the contents
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Open");
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = chooser.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file!= null)
            {
                FileInputStream fin = null;
                ObjectInputStream ins = null;
                try
                {
                    fin = new FileInputStream(file);
                    ins = new ObjectInputStream(fin);
                    doc = (DefaultStyledDocument)ins.readObject();
                    pane.setStyledDocument(doc);
                    JOptionPane.showMessageDialog(this,"Loaded successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
                finally
                {
                    if (fin != null)
                    {
                        try
                        {
                            fin.close();
                        }
                        catch (Exception ex){}

                    }
                    if (ins != null)
                    {
                        try
                        {
                            ins.close();
                        }
                        catch (Exception ex){}

                    }
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }

}

要保存
JTextPane
的内容,您可以使用正确的序列化方式将
JTextPane
DefaultStyledDocument
序列化到文件中。当您想再次加载内容时,您可以
反序列化该内容,并将其显示在
JTextPane
上。考虑下面给出的代码:

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class SaveEditor extends JFrame implements ActionListener{
     public static final String text = "As told by Wikipedia\n"
    +"Java is a general-purpose, concurrent, class-based, object-oriented computer programming language."
    + "It is specifically designed to have as few implementation "
    + "dependencies as possible. It is intended to let application developers write once, run anywhere (WORA), "
    + "meaning that code that runs on one platform does not need to be recompiled to run on another. "
    + "Java applications are typically compiled to bytecode (class file) that can run on any Java virtual "
    + "machine (JVM) regardless of computer architecture. Java is, as of 2012, one of the most popular programming "
    + "languages in use, particularly for client-server web applications, with a reported 10 million users.";
    JTextPane pane ;
    DefaultStyledDocument doc ;
    StyleContext sc;
    JButton save;
    JButton load;
    public static void main(String[] args) 
    {
        try 
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    SaveEditor se = new SaveEditor();
                    se.createAndShowGUI();
                }
            });
        } catch (Exception evt) {}
    }
    public void createAndShowGUI()
    {
        setTitle("TextPane");
        sc = new StyleContext();
        doc = new DefaultStyledDocument(sc);
        pane = new JTextPane(doc);
        save = new JButton("Save");
        load = new JButton("Load");
        JPanel panel = new JPanel();
        panel.add(save);panel.add(load);
        save.addActionListener(this);load.addActionListener(this);
        final Style heading2Style = sc.addStyle("Heading2", null);
        heading2Style.addAttribute(StyleConstants.Foreground, Color.red);
        heading2Style.addAttribute(StyleConstants.FontSize, new Integer(16));
        heading2Style.addAttribute(StyleConstants.FontFamily, "serif");
        heading2Style.addAttribute(StyleConstants.Bold, new Boolean(true));
        try 
        {
            doc.insertString(0, text, null);
            doc.setParagraphAttributes(0, 1, heading2Style, false);
        } catch (Exception e) 
        {
            System.out.println("Exception when constructing document: " + e);
            System.exit(1);
        }
        getContentPane().add(new JScrollPane(pane));
        getContentPane().add(panel,BorderLayout.SOUTH);
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent evt)
    {
        if (evt.getSource() == save)
        {
            save();
        }
        else if (evt.getSource() == load)
        {
            load();
        }
    }
    private void save()//Saving the contents .
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Save");
        int returnVal = chooser.showSaveDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file != null)
            {
                FileOutputStream fos = null;
                ObjectOutputStream os = null;
                try
                {
                    fos = new FileOutputStream(file);
                    os = new ObjectOutputStream(fos);
                    os.writeObject(doc);
                    JOptionPane.showMessageDialog(this,"Saved successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
                finally
                {
                    if (fos != null)
                    {
                        try
                        {
                            fos.close();
                        }
                        catch (Exception ex){}

                    }
                    if (os != null)
                    {
                        try
                        {
                            os.close();
                        }
                        catch (Exception ex){}

                    }
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    private void load()//Loading the contents
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Open");
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = chooser.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file!= null)
            {
                FileInputStream fin = null;
                ObjectInputStream ins = null;
                try
                {
                    fin = new FileInputStream(file);
                    ins = new ObjectInputStream(fin);
                    doc = (DefaultStyledDocument)ins.readObject();
                    pane.setStyledDocument(doc);
                    JOptionPane.showMessageDialog(this,"Loaded successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
                finally
                {
                    if (fin != null)
                    {
                        try
                        {
                            fin.close();
                        }
                        catch (Exception ex){}

                    }
                    if (ins != null)
                    {
                        try
                        {
                            ins.close();
                        }
                        catch (Exception ex){}

                    }
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }

}

您正在使用
JEditorPane
JTextPane
?您应该将文件中的状态保存在与要编辑/修改的数据不同的部分。打开文件时,加载此状态并重新安排GUI。嗨,Luiggi,你能详细解释一下吗?Vishal我正在使用JTextPane。你需要解释什么?我假设您序列化了文件中的数据,因此您需要一个
类GUIState implements Serializable
并存储您希望稍后保存/加载的GUI项的状态,然后通过序列化此
GUIState的实例和文件中的数据将数据保存在文件中,我假设它是
字符串(或者可能是另一个包含
字符串的类)。您正在使用的是
JEditorPane
JTextPane
?您应该将文件中的状态保存在与要编辑/修改的数据不同的部分。打开文件时,您将加载此状态并重新排列GUI。嗨,Luiggi,您能详细解释一下吗?Vishal,我正在使用JTextPane。您需要解释什么?我想知道如果要序列化文件中的数据,则需要一个
类GUIState implements Serializable
,并存储要稍后保存/加载的GUI项的状态,然后通过序列化此
GUIState的实例和文件中的数据将数据保存在文件中,我假设它是
字符串(或者可能是另一个包含
字符串的类)。谢谢Vishal。很抱歉这么晚才回复。嗨,Vishal,这可以在JPanel上完成吗。我的面板有很多按钮、图像、标签和其他东西。我可以全部保存吗?谢谢Vishal。很抱歉这么晚才回复。嗨,Vishal,这可以在JPanel上完成吗。我的面板有很多按钮、图像、标签和其他东西。我可以全部保存吗?