【问题标题】:How to store the recent items permanently using swing [duplicate]如何使用swing永久存储最近的项目[重复]
【发布时间】:2015-01-01 10:44:13
【问题描述】:

我想将最近打开的文件添加到最近的菜单。我做了那个任务。但是,它不会永久存储。这意味着当我关闭正在运行的应用程序时,最近的项目也被删除了。我想存储最近的项目永久,重新运行应用程序后,最近打开的项目可用。

我的代码:

public class RecentItems extends javax.swing.JFrame {
int i=0;
Queue<String> q;
JMenuItem item;
String recentPath;
int recentItems_count=0;
JTextPane textPane;
JScrollPane scrollPane;
public RecentItems() {
    initComponents();
    q=new LinkedList<>();
    textPane=new JTextPane();
    scrollPane=new JScrollPane(textPane);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    tp = new javax.swing.JTabbedPane();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    openAction = new javax.swing.JMenuItem();
    recentItems = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");

    openAction.setText("OPEN");
    openAction.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            openActionActionPerformed(evt);
        }
    });
    jMenu1.add(openAction);

    recentItems.setText("Recent");
    jMenu1.add(recentItems);

    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

private void openActionActionPerformed(java.awt.event.ActionEvent evt) {                                           
    FileDialog fd = new FileDialog(RecentItems.this, "Select File", FileDialog.LOAD);
    fd.setVisible(true);
    String title;
    String sts;
    File file;
    if (fd.getFile() != null) {
        sts = fd.getDirectory() + fd.getFile();
        file=new File(sts);
        title=fd.getFile();
        JInternalFrame internalFrame = new JInternalFrame("",true,true); 
        i++;
        internalFrame.setName("Doc "+i);
        internalFrame.setTitle(title);
        try {
            internalFrame.setSelected(true);
        } 
        catch (PropertyVetoException ex) {
            Logger.getLogger(RecentItems.class.getName()).log(Level.SEVERE, null, ex);
        }      
        internalFrame.add(scrollPane);
        tp.add(internalFrame);
        try{
            tp.setSelectedIndex(i-1);  
        }
        catch(IndexOutOfBoundsException ioe){   
        }
        try {
            textPane.setPage(file.toURI().toURL());
        } 
        catch (MalformedURLException ex) {
            Logger.getLogger(RecentItems.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (IOException ex) {
            Logger.getLogger(RecentItems.class.getName()).log(Level.SEVERE, null, ex);
        }
        setVisible(true);
        textPane.setCaretPosition(0);
        q.add(sts);
        recentItems_count++;              
        if(recentItems_count>1) {
            int size=q.size();
            String[] strArray = new String[q.size()];
            q.toArray(strArray);
            for(int k=0;k<size;k++) {
                for(int i=size-1;i>k;i--) {
                    if(strArray[k].equals(strArray[i])) {  
                        q.remove(strArray[k]); 
                        tp.remove(internalFrame);
                    }
                }
            }
        } 
        if(q.size()<=3) {
            recentItems.removeAll();
            for( String string : q) {  
                item=recentItems.add(string);
                recentPath=item.getText();
            }
        }
        else if(q.size()>3) {
            q.remove();
            recentItems.removeAll();
            for( String string : q)  {
                item=recentItems.add(string);
                recentPath=item.getText();
            }
        }
    }
}                                          

public static void main(String args[]) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(RecentItems.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(RecentItems.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(RecentItems.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(RecentItems.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new RecentItems().setVisible(true);
        }
    });
}                    
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem openAction;
private javax.swing.JMenu recentItems;
private javax.swing.JTabbedPane tp;                
}

【问题讨论】:

    标签: java swing permanent recent-file-list


    【解决方案1】:

    嗯,你应该将最近的文件存储在数据库或属性中。

    Here 是一个如何使用属性文件解决此问题的示例。

    【讨论】:

    • 是否可以从我的应用程序中调用该类。如果是,我该如何调用它。请检查一次。我无法理解示例中的某些部分。
    【解决方案2】:

    您应该使用Java Preferences API 以一种简单且跨平台的方式存储用户首选项。

    步骤:

    • 定义首选项对象:
      Preferences prefs = Preferences.userNodeForPackage(yourpackagename.class);

    • 设置引用的键名
      final String PREF_NAME = "recent_items";

    • 将值放入首选项
      prefs.put(PREF_NAME, value);

    • 在此首选项节点中检索与指定键关联的值
      String propertyValue = prefs.get(PREF_NAME, yourDefaultValue);

    代码:

    将其添加到您的示例后:

    package com.example;
    
    public class Test extends javax.swing.JFrame  implements ActionListener {
    
        int i = 0;
        Queue<String> q;
        JMenuItem item;
        String recentPath;
        int recentItems_count = 0;
        JTextPane textPane;
        JScrollPane scrollPane;
    
        // Retrieve the user's preference node for this package
        Preferences prefs = Preferences.userNodeForPackage(com.example.Test.class);
    
        // key name of the preference
        final String PREF_NAME = "recent_items";
        private List<String> itemsAll = new ArrayList<String>();
    
        public Test() {
            initComponents();
            q = new LinkedList<>();
            textPane = new JTextPane();
            scrollPane = new JScrollPane(textPane);
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
            tp = new javax.swing.JTabbedPane();
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            openAction = new javax.swing.JMenuItem();
            recentItems = new javax.swing.JMenu();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jMenu1.setText("File");
    
            openAction.setText("OPEN");
            openAction.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    openActionActionPerformed(evt);
                }
            });
            jMenu1.add(openAction);
    
            recentItems.setText("Recent");
            jMenu1.add(recentItems);
    
            loaditemsFromPreferences();
            for (String item : itemsAll) {
                JMenuItem newMenuItem = recentItems.add(item);
                newMenuItem.addActionListener(this);
            }
    
            jMenuBar1.add(jMenu1);
    
            setJMenuBar(jMenuBar1);
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
                    getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addComponent(tp,
                    javax.swing.GroupLayout.Alignment.TRAILING,
                    javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE));
            layout.setVerticalGroup(layout.createParallelGroup(
                    javax.swing.GroupLayout.Alignment.LEADING).addComponent(tp,
                    javax.swing.GroupLayout.Alignment.TRAILING,
                    javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE));
    
            pack();
        }// </editor-fold>
    
        private JInternalFrame loadFile(String sts, String title) {
            File file = new File(sts);
            JInternalFrame internalFrame = new JInternalFrame("", true, true);
            i++;
            internalFrame.setName("Doc " + i);
            internalFrame.setTitle(title);
            try {
                internalFrame.setSelected(true);
            } catch (PropertyVetoException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
            internalFrame.add(scrollPane);
            tp.add(internalFrame);
            try {
                tp.setSelectedIndex(i - 1);
            } catch (IndexOutOfBoundsException ioe) {
            }
            try {
                textPane.setPage(file.toURI().toURL());
            } catch (MalformedURLException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
            setVisible(true);
            textPane.setCaretPosition(0);
            q.add(sts);
            return internalFrame;
        }
    
        private void openActionActionPerformed(java.awt.event.ActionEvent evt) {
            FileDialog fd = new FileDialog(Test.this, "Select File",
                    FileDialog.LOAD);
            fd.setVisible(true);
            if (fd.getFile() != null) {
                String sts = fd.getDirectory() + fd.getFile();
                String title = fd.getFile();
                JInternalFrame internalFrame = loadFile(sts, title);
                recentItems_count++;
                if (recentItems_count > 1) {
                    int size = q.size();
                    String[] strArray = new String[q.size()];
                    q.toArray(strArray);
                    for (int k = 0; k < size; k++) {
                        for (int i = size - 1; i > k; i--) {
                            if (strArray[k].equals(strArray[i])) {
                                q.remove(strArray[k]);
                                tp.remove(internalFrame);
                            }
                        }
                    }
                }
    
                if (q.size() <= 3) {
                    recentItems.removeAll();
                    itemsAll.clear();
                    for (String string : q) {
                        item = recentItems.add(string);
                        recentPath = item.getText();
                        itemsAll.add(recentPath);
                        storeToPreferences();
                    }
                } else if (q.size() > 3) {
                    q.remove();
                    recentItems.removeAll();
                    itemsAll.clear();
                    for (String string : q) {
                        item = recentItems.add(string);
                        recentPath = item.getText();
                        itemsAll.add(recentPath);
                        storeToPreferences();
                    }
                }
            }
        }
    
        public static void main(String args[]) {
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
                        .getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(Test.class.getName()).log(
                        java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(Test.class.getName()).log(
                        java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(Test.class.getName()).log(
                        java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(Test.class.getName()).log(
                        java.util.logging.Level.SEVERE, null, ex);
            }
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Test().setVisible(true);
                }
            });
        }
    
        private void loaditemsFromPreferences() {
            for (int i = 0; i < maxItems; i++) {
                String value = prefs.get(PREF_NAME + i, "");
                if (!value.equals("")) {
                    itemsAll.add(value);
                } else {
                    break;
                }
            }
        }
    
        private void storeToPreferences() {
            for (int i = 0; i < maxItems; i++) {
                if (i < itemsAll.size()) {
                    prefs.put(PREF_NAME + i, (String) itemsAll.get(i));
                } else {
                    prefs.remove(PREF_NAME + i);
                }
            }
        }
    
    
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JMenuItem openAction;
        private javax.swing.JMenu recentItems;
        private javax.swing.JTabbedPane tp;
        private final int maxItems = 3;
    
        public void actionPerformed(ActionEvent e) {
            System.out.println("Selected: " + e.getActionCommand());
            loadFile(e.getActionCommand(), e.getActionCommand());
        }
    }
    

    相关文档:

    替代方案:

    您可能希望考虑使用PersistenceService,这是Java Web Start 的一项功能,“提供了在客户端系统上本地存储数据的方法,即使对于在受限执行环境中运行的应用程序也是如此。”相关示例可以在herehere 找到。

    【讨论】:

    • +1 为示例;也考虑这个alternative
    • 谢谢。上面的代码工作正常。但是,它会产生一个警告,如“2014 年 11 月 6 日上午 10:25:04 java.util.prefs.WindowsPreferences 警告:无法打开/create prefs root node Software\JavaSoft\Prefs at root 0x80000002。Windows RegCreateKeyEx(...) 返回错误代码 5."。如何解决警告。
    • @user3792689:我没有收到警告,但它似乎是 Java 跟踪器中的 open issuesee here
    猜你喜欢
    • 2017-08-15
    • 2015-08-24
    • 2016-11-19
    • 1970-01-01
    • 2017-07-25
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多