java - SWING - 在this.dispose之后保存数据

时间:2014-08-22 23:15:50

标签: java swing user-interface

所以基本上我用Java制作Swing应用程序,我有一个列表,用户可以通过键入文本字段和按钮来添加项目(当用户点击该按钮,窗口处理并打开新窗口时)。在新窗口我只有按钮,将驱动我回到第一个窗口,但数据插入列表删除。有没有办法避免这种情况(我知道有,但如果有人能解释我会怎么样:))。

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class first extends JFrame {

    public static final long serialVersionUID = 1L;

    private JFrame frame;
    private JButton button, button2;
    private JComboBox box;
    private JScrollPane scroll;
    private DefaultListModel defListModel = new DefaultListModel();
    private JList list;
    private JPanel panel;
    private JTextField field;

    public First() {

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e) {
            e.printStackTrace();
        }

        frame = new JFrame("Hello Eclipse");

        panel = new JPanel();

        field = new JTextField("", 25);
        panel.add(field);

        button = new JButton("Click to add to the list");
        button.setFocusPainted(false);
        button.setToolTipText("Hovered Over ME");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(e.getSource() == button){
                    String text = field.getText();
                    defListModel.addElement(text);
                    JOptionPane.showMessageDialog(frame, "Added to the list", "Done",      JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });
        panel.add(button);

        button2 = new JButton("New Window");
        button2.setFocusPainted(false);
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(e.getSource() == button2){
                    NewWindow window = new NewWindow();
                    frame.setVisible(false);

                }
            }
        });
        panel.add(button2);

        String[] movies = {};

        for(String movie : movies){
            defListModel.addElement(movie);
        }

        list = new JList(defListModel);

        list.setFixedCellWidth(150);
        list.setFixedCellHeight(30);

        scroll = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        panel.add(scroll);

        frame.add(panel);
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        frame.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        new First();
    }

}

提前致谢!

1 个答案:

答案 0 :(得分:3)

您可以使用CardLayout为多个视图使用相同的空间。

提示:点击任何JPanel时,只需在多个JButton之间切换。

详细了解How to Use CardLayout


如果您想坚持使用当前的方法,请尝试使用WindowListener

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowDeactivated(WindowEvent arg0) {
        System.out.println("windowDeactivated");
        // save the data
    }
});

如果需要,也可以覆盖windowClosing()方法。

您也可以覆盖setVisible()的{​​{1}}方法,以检查JFrame的可见性。

请参阅The Use of Multiple JFrames, Good/Bad Practice?


怀疑:为什么同时使用扩展JFrame类在类中添加JFrame个实例?