GUI保存功能,以便在GUI关闭时,重新打开时,它具有相同的数据可见

时间:2013-08-01 03:29:48

标签: java user-interface save savestate

  

GUI保存功能,以便在GUI关闭时,重新打开时,它具有相同的数据可见。现在GUI工作正常,逻辑段未完成,但这不会影响手头的问题。谢谢小伙子们。

    import java.awt.*; 
import java.awt.event.*;
    import javax.swing.*; 
    import java.text.NumberFormat;
    import java.lang.Math;

    public class abdul { 

        public static void main(String[] args) { 
            JFrame frame = new FutureValueFrame(); 
        frame.setVisible(true); } }

    class FutureValueFrame extends JFrame {
        public FutureValueFrame() { 
        setTitle("Loan Calculator");
        setSize(300, 300); 
        centerWindow(this); 
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        JPanel panel = new FutureValuePanel(); 
        this.add(panel); } 
        private void centerWindow(Window w) { 
            Toolkit tk = Toolkit.getDefaultToolkit(); 
            Dimension d = tk.getScreenSize(); 
            setLocation((d.width-w.getWidth())/2, (d.height-w.getHeight())/2); } }

    class FutureValuePanel extends JPanel implements ActionListener {
        private JTextField paymentText, rateText, yearsText, loanText;
        private JLabel paymentLabel, rateLabel, yearsLabel, loanLabel; 
        private JButton calculateButton, exitButton, paymentButton, loanButton;

        public FutureValuePanel() { // display panel 
        JPanel displayPanel = new JPanel();
        displayPanel.setLayout( new FlowLayout(FlowLayout.RIGHT));


         loanLabel = new JLabel("Loan Amount:");
        displayPanel.add(loanLabel); 
        //hello
        loanText = new JTextField(10);
        displayPanel.add(loanText);

        //////



        ///////
        rateLabel = new JLabel("Yearly Interest Rate:"); 
        displayPanel.add(rateLabel); 

        rateText = new JTextField(10);
        displayPanel.add(rateText); 


    ////////
        yearsLabel = new JLabel("Number of Years:"); 
        displayPanel.add(yearsLabel);

        yearsText = new JTextField(10);
        displayPanel.add(yearsText); 



    ////////
        paymentLabel = new JLabel("Monthly Payment:"); 
        displayPanel.add(paymentLabel); 
        //hello
        paymentText = new JTextField(10); 
        displayPanel.add(paymentText);  


    // button panel
    JPanel buttonPanel = new JPanel();
    JPanel alphaPanel = new JPanel();
    ;
    buttonPanel.setLayout( new FlowLayout(FlowLayout.RIGHT));
    alphaPanel.setLayout( new FlowLayout(FlowLayout.RIGHT));

    // calculate button 
    calculateButton = new JButton("Calculate");
    calculateButton.addActionListener(this);
    buttonPanel.add(calculateButton); 

    paymentButton = new JButton("Monthly Payment");
    paymentButton.addActionListener(this);
    alphaPanel.add(paymentButton);


    loanButton = new JButton("Loan Amount");
    loanButton.addActionListener(this);
    alphaPanel.add(loanButton);


    // exit button
    exitButton = new JButton("Exit");
    exitButton.addActionListener(this); 
    buttonPanel.add(exitButton); 
    // add panels to main panel
    this.setLayout(new BorderLayout());
    this.add(displayPanel, BorderLayout.CENTER);
    this.add(buttonPanel, BorderLayout.SOUTH); 
    this.add(alphaPanel, BorderLayout.NORTH);
    }

    public void actionPerformed(ActionEvent e) {

        Object source = e.getSource(); 
        if(source == exitButton) {
            System.exit(0);}
        if (source == paymentButton){
            paymentText.setEditable(false);
            paymentText.setFocusable(false);
            paymentText.setText(null);
            loanText.setEditable(true);
            loanText.setFocusable(true);
            }

        if (source == loanButton){
            loanText.setEditable(false);
            loanText.setFocusable(false); 
            loanText.setText(null);
            paymentText.setEditable(true);
            paymentText.setFocusable(true);
        }
        if (source == calculateButton){
            NumberFormat currency = NumberFormat.getCurrencyInstance();
            //  paymentText.setText(currency.format(Double.parseDouble(loanText.getText())));
            if()
            String the = currency.format(Double.parseDouble(loanText.getText()));
                        paymentText.setText(the);

            }

        }

        }

2 个答案:

答案 0 :(得分:1)

您需要将WindowListener附加到FutureValueFrame并监控windowClosing事件。

发生这种情况时,您需要编写要保留的设置。

加载应用程序后,您只需阅读这些设置并将其应用到您的应用程序

查看How to write Window Listeners了解详情

至于实际存储,你有很多选择...

您可以使用具有Propertiessave功能的load API,但它基于简单的键/值对API。

您还可以使用Preferences API,它具有更多功能(存储基元),但您无法控制数据的存储位置(或多或少)

选择将取决于您想要实现的目标以及您想要的工作量

答案 1 :(得分:0)

当我制作一个简单的java代码(文本)编辑器时,我尝试过这个。 我想存储首选项,以便突出显示的单词在所有会话中都具有用户选择的颜色等。

我使用了Window Listener(我上面的答案解释得相当不错)并使首选项成为xml-ish形式,如:

<preferences>
<fontcolor = "blue">
<fontsize  = "11">
...
</preferences>

所以你可以做的是(在窗口监听器代码中)格式化你想要存储的数据:

<LastState>
<textfield1 = "textfield_1 value at last exit">
<radioButtonGroup1 = "2">
...
</LastState>

并使用标准IO库(流)将它们保存在文件中(例如“lastSession.dat”或“lastSession.xml” - 如果您希望它可由文本编辑器修改)

您可以使用此功能之类的东西来帮助您

String xmlForm(String tag, String data){

    return "<\"+tag = \""+data+"\">";
}

在tag参数中,您可以传递一个小部件字符串名称,在“数据”中,显然是它的当前状态。

然后,每次你的程序启动时,你必须做一些读取该文件的例程(如果这样的文件存在)并将值设置回小部件。 (某种xml解析器)。

此方法绝对稳定,可以完全控制文件的位置(提高可移植性)和文件格式(您可以选择文件包含的内容以及如何将其转换回小部件值 - 您可以使用任何你想要的格式)。 最后,它是完全可重用的,因为xml是一个非常标准且非常适合代码的文本格式!您可以在具有类似需求的其他项目中附加此(几乎未触及的)代码!

希望我帮助!!!