Java 从文件系统加载对象后更新GUI

Java 从文件系统加载对象后更新GUI,java,swing,serialization,Java,Swing,Serialization,我是一名Java新手,正在进行我的第一个Java项目。到目前为止,它由一个带有动态生成表单(改编自)的GUI、一个保存按钮和一个加载按钮组成。使用“保存”按钮,整个表单保存为对象,使用“加载”按钮,可以加载现有保存的表单。保存和加载本身似乎可以正常工作,但在加载按钮的actionPerformed方法中,当我(间接地,即通过另一个函数)调用revalidate()和repaint()时,GUI没有使用加载的表单正确更新: 在此,panel属于JPanel的一个子类: public class S

我是一名Java新手,正在进行我的第一个Java项目。到目前为止,它由一个带有动态生成表单(改编自)的GUI、一个保存按钮和一个加载按钮组成。使用“保存”按钮,整个表单保存为对象,使用“加载”按钮,可以加载现有保存的表单。保存和加载本身似乎可以正常工作,但在加载按钮的
actionPerformed
方法中,当我(间接地,即通过另一个函数)调用
revalidate()
repaint()
时,GUI没有使用加载的表单正确更新:

在此,
panel
属于
JPanel
的一个子类:

public class ScrollBar extends JPanel {

    private static final long serialVersionUID = -3460555902426579496L;
    private JScrollPane scrollPane;
    private JButton saveList, loadList;
    private EntryList entryList;

    @SuppressWarnings("hiding")
    public ScrollBar(EntryList entryList, MainFrame frame) {
        scrollPane = new JScrollPane(entryList,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setPreferredSize(new Dimension(300,400));        
        this.entryList = entryList;
        saveList = new JButton("Save List");
        saveList.addActionListener(new SaveListener("Save List", this));
        loadList = new JButton("Load List");
        loadList.addActionListener(new LoadListener("Load List", this));
        add(scrollPane);
        add(saveList);
        add(loadList);
    }

    public EntryList getEntryList() {
        return entryList;
    }

    public void setEntryList(EntryList list) {
        entryList = list;
        this.saveList.setBackground(Color.PINK);
        this.saveList.setText(entryList.getFirstText());
        this.loadList.setBackground(Color.GREEN);
        revalidate();
        repaint();
    }
}
下面列出了运行该示例所需的其余类:

public class Entry extends JPanel implements Serializable{

    private static final long serialVersionUID = 8748191176188997955L;
    private JTextField textField;
    private JButton plus;
    private JButton minus;
    private EntryList parent;

    public Entry(String textFieldText, EntryList list) {
        this.parent = list;
        this.plus = new JButton(new AddEntryAction());
        this.minus = new JButton(new RemoveEntryAction());
        this.textField = new JTextField(10);
        this.textField.setText(textFieldText);
        add(this.plus);
        add(this.minus);
        add(this.textField);
    }

    public String getText() {
        return this.textField.getText();
    }

    public class AddEntryAction extends AbstractAction {

        private static final long serialVersionUID = -1936452299010320790L;

        public AddEntryAction() {
            super("+");
        }

        public void actionPerformed(ActionEvent e) {
            parent.cloneEntry(Entry.this);
        }

    }

    public class RemoveEntryAction extends AbstractAction {

        private static final long serialVersionUID = 4843871176230776949L;

        public RemoveEntryAction() {
            super("-");
        }

        public void actionPerformed(ActionEvent e) {
            parent.removeItem(Entry.this);
        }
    }

    public void enableAdd(boolean enabled) {
        this.plus.setEnabled(enabled);
    }
    public void enableMinus(boolean enabled) {
        this.minus.setEnabled(enabled);
    }
}


public class EntryList extends JPanel implements Serializable{

    private static final long serialVersionUID = 1426379083556312697L;
    private List<Entry> entries;

    public EntryList() {
        this.entries = new ArrayList<Entry>();
        Entry initial = new Entry("debugtext", this);
        addItem(initial);
    }

    public int getLength() {
        return this.entries.size();
    }
    public String getFirstText() {
        return this.entries.get(0).getText();
    }

    public void cloneEntry(Entry entry) {
        Entry theClone = new Entry("", this);
        addItem(theClone);
    }

    private void addItem(Entry entry) {
        entries.add(entry);
        add(entry);
        refresh();
    }

    public void removeItem(Entry entry) {
        entries.remove(entry);
        remove(entry);
        refresh();
    }

    private void refresh() {
        revalidate();

        if (entries.size() == 1) {
            entries.get(0).enableMinus(false);
        }
        else {
            for (Entry e : entries) {
                e.enableMinus(true);
            }
        }
    }
}

public class SaveListener extends DirectoryChooser implements ActionListener {

    private static final long serialVersionUID = -8842006866700189526L;
    private EntryList list;
    private String filename;

    public SaveListener(String choosertitle, ScrollBar bar) {
        super(choosertitle, false);
        this.list = bar.getEntryList();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        super.actionPerformed(e);
        try {
            filename = this.getResultsDirectory();
            OutputStream os = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(list);
            oos.close();
            System.out.println("Length of list at saving = " + this.list.getLength());
            System.out.println("Length of list at saving = " + this.list.getFirstText());

        } catch (FileNotFoundException e1) {
            System.out.println("File not found: " + filename);
            e1.printStackTrace();
        } catch (IOException e1) {
            System.out.println("IO Exception: " + e1);
            e1.printStackTrace();
        }
    }
}

public class DirectoryChooser extends JPanel implements ActionListener {

    private static final long serialVersionUID = -8143869075088499054L;
    private JButton setwd;
    private String workingdir;

    private JFileChooser chooser;
    private String choosertitle;
    private boolean directoryOnly = true;

    @SuppressWarnings("hiding")
    public DirectoryChooser(String choosertitle) {
        this.choosertitle = choosertitle;
        setwd = new JButton(choosertitle);
        setwd.addActionListener(this);
        add(setwd);
        workingdir = new File(System.getProperty("user.dir")).toString();
    }

    @SuppressWarnings("hiding")
    public DirectoryChooser(String choosertitle, boolean directoryOnly) {
        this(choosertitle);
        this.directoryOnly = directoryOnly;
    }

    public void actionPerformed(ActionEvent e) {    

        chooser = new JFileChooser(); 
        chooser.setCurrentDirectory(new java.io.File("."));
        chooser.setDialogTitle(choosertitle);
        if (directoryOnly) {
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        }
        chooser.setAcceptAllFileFilterUsed(false);

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
            workingdir = chooser.getSelectedFile().toString();
        } else {
            workingdir = chooser.getCurrentDirectory().toString();
        }
    }

    public String getResultsDirectory() {
        return workingdir;
    }

    public Dimension getPreferredSize(){
        return new Dimension(200, 200);
    }
}

public class SingleFileChooser extends JPanel implements ActionListener {

    private static final long serialVersionUID = -9068219101747975546L;
    private JButton loadFiles;
    private JFileChooser chooser;
    private String choosertitle;
    private File file;
    private String filePath;
    private FileNameExtensionFilter filter; 

    @SuppressWarnings("hiding")
    public SingleFileChooser(String choosertitle) {
        this.choosertitle = choosertitle;
        loadFiles = new JButton(choosertitle);
        loadFiles.addActionListener(this);
        add(loadFiles);
    }

    @SuppressWarnings("hiding")
    public SingleFileChooser(String choosertitle, FileNameExtensionFilter filter) {
        this(choosertitle);
        this.filter = filter;
    }

    public void actionPerformed(ActionEvent e) {    

        chooser = new JFileChooser(); 
        chooser.setMultiSelectionEnabled(false);
        if (filter != null) {
            chooser.setFileFilter(filter);
        }
        chooser.setDialogTitle(choosertitle);
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);


        int returnVal = chooser.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            file = chooser.getSelectedFile();
            filePath = file.getAbsolutePath();
        }
    }

    public File getFile() {
        return file;
    }

    public String getFilePath(){
        return filePath;
    }

    public Dimension getPreferredSize(){
        return new Dimension(200, 200);
    }
}

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 512941639567306317L;
    EntryList panel = new EntryList();
    ScrollBar scrollPanel = new ScrollBar(panel, this);

    public MainFrame() throws HeadlessException {   
        this.getContentPane().add(scrollPanel);
        this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
    }
}

public class GUImain {

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null); // center the window
    }
}
公共类条目扩展JPanel实现可序列化{
私有静态最终长serialVersionUID=8748191176188997955L;
私有JTextField textField;
私人JButton plus;
私有JButton减号;
私有入口列表父级;
公共条目(字符串文本字段文本,条目列表){
this.parent=列表;
this.plus=new JButton(new AddEntryAction());
this.减号=new JButton(new removentryAction());
this.textField=新的JTextField(10);
this.textField.setText(textFieldText);
加上(这个加上);
加(这个减);
添加(this.textField);
}
公共字符串getText(){
返回此.textField.getText();
}
公共类AddEntryAction扩展了AbstractAction{
私有静态最终长serialVersionUID=-193645229910320790L;
公共AddEntryAction(){
超级(“+”);
}
已执行的公共无效操作(操作事件e){
parent.cloneEntry(Entry.this);
}
}
公共类RemoveEntryAction扩展了AbstractAction{
私有静态最终长serialVersionUID=484387117623077694L;
公共RemoveEntryAction(){
超级(“-”);
}
已执行的公共无效操作(操作事件e){
parent.removietem(Entry.this);
}
}
public void enableAdd(已启用布尔值){
此.plus.setEnabled(已启用);
}
public void enableMinus(已启用布尔值){
此.减.setEnabled(已启用);
}
}
公共类EntryList扩展了JPanel实现可序列化{
私有静态最终长serialVersionUID=1426379083556312697L;
私人名单条目;
公共条目列表(){
this.entries=new ArrayList();
条目初始值=新条目(“调试文本”,本);
附加项(首字母);
}
公共整数getLength(){
返回此.entries.size();
}
公共字符串getFirstText(){
返回this.entries.get(0.getText();
}
公共无效克隆入口(入口){
条目克隆=新条目(“,this);
附加项(克隆);
}
专用作废附加项(条目){
条目。添加(条目);
添加(条目);
刷新();
}
公共无效删除项(条目){
条目。删除(条目);
移走(进入);
刷新();
}
私有无效刷新(){
重新验证();
if(entries.size()==1){
entries.get(0).enableMinus(false);
}
否则{
对于(条目e:条目){
e、 启用最小值(真);
}
}
}
}
公共类SaveListener扩展DirectoryChooser实现ActionListener{
私有静态最终长serialVersionUID=-8842006866700189526L;
私有入口列表;
私有字符串文件名;
公共存储侦听器(字符串选择器标题、滚动条){
super(choosertitle,false);
this.list=bar.getEntryList();
}
@凌驾
已执行的公共无效操作(操作事件e){
super.执行的行动(e);
试一试{
filename=this.getResultsDirectory();
OutputStream os=新文件OutputStream(文件名);
ObjectOutputStream oos=新的ObjectOutputStream(os);
oos.writeObject(列表);
oos.close();
System.out.println(“保存时的列表长度=“+this.list.getLength());
System.out.println(“保存时的列表长度=“+this.list.getFirstText());
}捕获(FileNotFoundException e1){
System.out.println(“未找到文件:“+filename”);
e1.printStackTrace();
}捕获(IOE1异常){
System.out.println(“IO异常:+e1”);
e1.printStackTrace();
}
}
}
公共类DirectoryChooser扩展JPanel实现ActionListener{
私有静态最终长serialVersionUID=-8143869075088499054L;
私有JButton setwd;
私有字符串工作目录;
私有JFileChooser选择器;
私有字符串选择器标题;
private boolean directoryOnly=true;
@抑制警告(“隐藏”)
公共目录选择器(字符串选择器标题){
this.choosertitle=choosertitle;
setwd=新的JButton(选择标题);
setwd.addActionListener(这个);
添加(setwd);
workingdir=新文件(System.getProperty(“user.dir”)).toString();
}
@抑制警告(“隐藏”)
公共目录选择器(字符串选择器标题,仅布尔目录){
此(选择标题);
this.directoryOnly=directoryOnly;
}
已执行的公共无效操作(操作事件e){
chooser=newjfilechooser();
chooser.setCurrentDirectory(新的java.io.File(“.”);
选择器.setDialogTitle(选择器标题);
如果(仅适用于目录){
setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_);
}
选择器.setAcceptableFileFilterUsed(false);
如果(chooser.showOpenDialog(this)=JFileChooser.APPROVE_选项){
workingdir=chooser.getSelectedFile().toString();
}否则{
workingdir=chooser.getCurrentDirectory().toString();
}
}
公共字符串getResults
public class Entry extends JPanel implements Serializable{

    private static final long serialVersionUID = 8748191176188997955L;
    private JTextField textField;
    private JButton plus;
    private JButton minus;
    private EntryList parent;

    public Entry(String textFieldText, EntryList list) {
        this.parent = list;
        this.plus = new JButton(new AddEntryAction());
        this.minus = new JButton(new RemoveEntryAction());
        this.textField = new JTextField(10);
        this.textField.setText(textFieldText);
        add(this.plus);
        add(this.minus);
        add(this.textField);
    }

    public String getText() {
        return this.textField.getText();
    }

    public class AddEntryAction extends AbstractAction {

        private static final long serialVersionUID = -1936452299010320790L;

        public AddEntryAction() {
            super("+");
        }

        public void actionPerformed(ActionEvent e) {
            parent.cloneEntry(Entry.this);
        }

    }

    public class RemoveEntryAction extends AbstractAction {

        private static final long serialVersionUID = 4843871176230776949L;

        public RemoveEntryAction() {
            super("-");
        }

        public void actionPerformed(ActionEvent e) {
            parent.removeItem(Entry.this);
        }
    }

    public void enableAdd(boolean enabled) {
        this.plus.setEnabled(enabled);
    }
    public void enableMinus(boolean enabled) {
        this.minus.setEnabled(enabled);
    }
}


public class EntryList extends JPanel implements Serializable{

    private static final long serialVersionUID = 1426379083556312697L;
    private List<Entry> entries;

    public EntryList() {
        this.entries = new ArrayList<Entry>();
        Entry initial = new Entry("debugtext", this);
        addItem(initial);
    }

    public int getLength() {
        return this.entries.size();
    }
    public String getFirstText() {
        return this.entries.get(0).getText();
    }

    public void cloneEntry(Entry entry) {
        Entry theClone = new Entry("", this);
        addItem(theClone);
    }

    private void addItem(Entry entry) {
        entries.add(entry);
        add(entry);
        refresh();
    }

    public void removeItem(Entry entry) {
        entries.remove(entry);
        remove(entry);
        refresh();
    }

    private void refresh() {
        revalidate();

        if (entries.size() == 1) {
            entries.get(0).enableMinus(false);
        }
        else {
            for (Entry e : entries) {
                e.enableMinus(true);
            }
        }
    }
}

public class SaveListener extends DirectoryChooser implements ActionListener {

    private static final long serialVersionUID = -8842006866700189526L;
    private EntryList list;
    private String filename;

    public SaveListener(String choosertitle, ScrollBar bar) {
        super(choosertitle, false);
        this.list = bar.getEntryList();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        super.actionPerformed(e);
        try {
            filename = this.getResultsDirectory();
            OutputStream os = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(list);
            oos.close();
            System.out.println("Length of list at saving = " + this.list.getLength());
            System.out.println("Length of list at saving = " + this.list.getFirstText());

        } catch (FileNotFoundException e1) {
            System.out.println("File not found: " + filename);
            e1.printStackTrace();
        } catch (IOException e1) {
            System.out.println("IO Exception: " + e1);
            e1.printStackTrace();
        }
    }
}

public class DirectoryChooser extends JPanel implements ActionListener {

    private static final long serialVersionUID = -8143869075088499054L;
    private JButton setwd;
    private String workingdir;

    private JFileChooser chooser;
    private String choosertitle;
    private boolean directoryOnly = true;

    @SuppressWarnings("hiding")
    public DirectoryChooser(String choosertitle) {
        this.choosertitle = choosertitle;
        setwd = new JButton(choosertitle);
        setwd.addActionListener(this);
        add(setwd);
        workingdir = new File(System.getProperty("user.dir")).toString();
    }

    @SuppressWarnings("hiding")
    public DirectoryChooser(String choosertitle, boolean directoryOnly) {
        this(choosertitle);
        this.directoryOnly = directoryOnly;
    }

    public void actionPerformed(ActionEvent e) {    

        chooser = new JFileChooser(); 
        chooser.setCurrentDirectory(new java.io.File("."));
        chooser.setDialogTitle(choosertitle);
        if (directoryOnly) {
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        }
        chooser.setAcceptAllFileFilterUsed(false);

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
            workingdir = chooser.getSelectedFile().toString();
        } else {
            workingdir = chooser.getCurrentDirectory().toString();
        }
    }

    public String getResultsDirectory() {
        return workingdir;
    }

    public Dimension getPreferredSize(){
        return new Dimension(200, 200);
    }
}

public class SingleFileChooser extends JPanel implements ActionListener {

    private static final long serialVersionUID = -9068219101747975546L;
    private JButton loadFiles;
    private JFileChooser chooser;
    private String choosertitle;
    private File file;
    private String filePath;
    private FileNameExtensionFilter filter; 

    @SuppressWarnings("hiding")
    public SingleFileChooser(String choosertitle) {
        this.choosertitle = choosertitle;
        loadFiles = new JButton(choosertitle);
        loadFiles.addActionListener(this);
        add(loadFiles);
    }

    @SuppressWarnings("hiding")
    public SingleFileChooser(String choosertitle, FileNameExtensionFilter filter) {
        this(choosertitle);
        this.filter = filter;
    }

    public void actionPerformed(ActionEvent e) {    

        chooser = new JFileChooser(); 
        chooser.setMultiSelectionEnabled(false);
        if (filter != null) {
            chooser.setFileFilter(filter);
        }
        chooser.setDialogTitle(choosertitle);
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);


        int returnVal = chooser.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            file = chooser.getSelectedFile();
            filePath = file.getAbsolutePath();
        }
    }

    public File getFile() {
        return file;
    }

    public String getFilePath(){
        return filePath;
    }

    public Dimension getPreferredSize(){
        return new Dimension(200, 200);
    }
}

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 512941639567306317L;
    EntryList panel = new EntryList();
    ScrollBar scrollPanel = new ScrollBar(panel, this);

    public MainFrame() throws HeadlessException {   
        this.getContentPane().add(scrollPanel);
        this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
    }
}

public class GUImain {

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null); // center the window
    }
}
public void addItem(String text) {
    Entry entry = new Entry(text, this);
    entries.add(entry);
    add(entry);
}
    //get all stored Entry strings from file into a List (for example) 
    List<String>entriesText = getEntriesStringsFromFile(); 

    EntryList eList = new EntryList(); //make a new EntryList 
    for (String text : entriesText){ //add all content to EntryList
        eList.addItem(text);
    }
public void cloneEntry(Entry entry) {
    Entry theClone = new Entry(entry.getText(), this);
    addItem(theClone);
}