如何记住Swing GUI表单中的最后一个值?

时间:2010-01-11 16:26:32

标签: java swing

我有一个用Swing制作的简单Java GUI表单。它有一些文本输入和复选框,我希望它记住输入到这些输入的最后一个值。当然可以手动将它们保存到某个文件然后读取文件并填充输入,但我想知道是否有办法自动或多或少地执行此操作。感谢

3 个答案:

答案 0 :(得分:5)

最好使用Preferences API

它将首选项存储在系统中,但这些详细信息对您隐藏 - 您关注的是首选项的结构和值,而不是实现细节(特定于平台)。

此API还允许在同一台计算机上为不同用户进行不同的设置。

答案 1 :(得分:3)

根据应用程序的大小和数据量,可以选择序列化整个UI。

但是,当信息基本上被检索并存储在数据库中时,这可能是一个坏主意。在这种情况下,应该使用值对象和绑定,但对于一些简单的应用程序,其中UI独立于另一种持久化方式,您可以使用它。

当然,您无法直接修改序列化值,因此请将此视为额外选项:

alt text http://img684.imageshack.us/img684/4581/capturadepantalla201001p.png

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

public class SwingTest {
    public static void main( String [] args ) {
        final JFrame frame = getFrame();
        frame.pack();        
        frame.setVisible( true );
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                writeToFile( frame, "swingtest.ser");
            } 
        });
    }

    /**
     * Reads it serialized or create a new one if it doens't exists
     */ 
    private static JFrame getFrame(){
        File file = new File("swingtest.ser");
        if( !file.exists() ) {
            System.out.println("creating a new one");
            JFrame frame = new JFrame();
            JPanel panel = new JPanel();
            panel.add( new JLabel("Some test here:"));
            panel.add( new JTextField(10));
            frame.add( panel );
            return frame;
        } else {
            return ( JFrame ) readObjectFrom( file );
        }
    }

这里的读/写为草图,这里有很大的改进空间。

    /**
     * write the object to a file 
     */
    private static void writeToFile( Serializable s , String fileName ) {
        ObjectOutputStream oos = null;

        try {
            oos = new ObjectOutputStream( new FileOutputStream( new File( fileName )));
            oos.writeObject( s );    
        } catch( IOException ioe ){

        } finally {
            if( oos != null ) try {
                oos.close();
            } catch( IOException ioe ){}
        }

    }
    /**
     * Read an object from the file 
     */
    private static Object readObjectFrom( File f ) {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream( new FileInputStream( f )) ;
            return ois.readObject();
        } catch( ClassNotFoundException cnfe ){
            return null;
        } catch( IOException ioe ) {
            return null;
        } finally {
            if( ois != null ) try {
                ois.close();
            } catch( IOException ioe ){}
        }
    }
} 

答案 2 :(得分:0)

不是真的。您必须自己将值保存到文件或数据库中。