【问题标题】:Why can't I retrieve my buttons when I run my program?为什么我在运行程序时无法检索我的按钮?
【发布时间】:2016-03-03 05:26:38
【问题描述】:

所以,我的程序是用户在运行时添加按钮。当他/她单击“保存”按钮时,程序将保存到文件中。但是当我再次运行它时,按钮消失了。我尝试使用 XMLEncoder 和 XMLDecoder 序列化我的按钮,但是当我运行我的程序时,它没有保存任何东西,它又重新开始了。 如何正确序列化它,以便在我启动程序时,按钮在那里?任何帮助将不胜感激。
这是我的代码的 sn-p:

   public class saveButton
   {
   //JFrame and JPanels have been declared earlier

   class ClickListener implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           str = JOptionPane.showInputDialog("What is the name of the new button?"); 
           JButton b = new JButton(str);
           frame.add(b);
           try
           {
               XMLEncoder encdr = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("file.ser")));
               encdr.writeObject(new JButton(str));
               encdr.close();
           }
           catch (IOException e)
           {
               e.printStackTrace();
           }
       }
   }

   ActionListener addButtonClicked = new ClickListener();
   b.addActionListener(addButtonClicked);

   class ClickListenerTwo implements ActionListener
   {
       public void actionPerformed(ActionEvent f)
       {
           try
           {
               XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream("file.ser")));
               Object result = d.readObject();
               d.close();
           }
           catch (IOException decoder)
           {
               decoder.printStackTrace();
           }
       }

   } 

【问题讨论】:

  • 序列化你的按钮不是这里的方法。首先,你为什么要序列化它们?为了定位?还是为了别的?
  • 我正在对它们进行序列化,以便以后运行程序时可以检索它们。
  • 你的解码没有做任何事情,它应该将按钮添加回屏幕
  • 可能对整个容器进行编码/解码
  • 由于您似乎将按钮直接添加到框架的内容窗格中,因此可能对其进行编码

标签: java swing button serialization


【解决方案1】:

解码对象后,需要适当地转换对象,然后将组件添加到容器中。

这是一个非常基本的示例,每次单击 Random 按钮时都会在面板上生成随机数量的按钮。当您单击 Save 时,面板会保存到磁盘,当您单击 Load 时,它会从磁盘加载面板并将其重新应用到容器中

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private RandomButtonPane pane;

        public TestPane() {
            setLayout(new BorderLayout());

            JPanel actions = new JPanel();

            JButton random = new JButton("Random");
            JButton save = new JButton("Save");
            JButton load = new JButton("Load");

            actions.add(random);
            actions.add(save);
            actions.add(load);

            add(actions, BorderLayout.SOUTH);

            random.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (pane != null) {
                        remove(pane);
                    }

                    pane = new RandomButtonPane();
                    pane.randomise();
                    add(pane);

                    Window window = SwingUtilities.windowForComponent(TestPane.this);
                    window.pack();
                    window.setLocationRelativeTo(null);
                }
            });

            save.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (pane != null) {
                        try (OutputStream os = new FileOutputStream(new File("Save.dat"))) {
                            try (XMLEncoder encoder = new XMLEncoder(os)) {
                                encoder.writeObject(pane);
                                remove(pane);
                                pane = null;
                            }
                        } catch (IOException exp) {
                            exp.printStackTrace();
                        }
                    }
                }
            });

            load.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (pane != null) {
                        remove(pane);
                        pane = null;
                    }

                    try (InputStream is = new FileInputStream(new File("Save.dat"))) {
                        try (XMLDecoder decoder = new XMLDecoder(is)) {
                            Object value = decoder.readObject();
                            if (value instanceof RandomButtonPane) {
                                pane = (RandomButtonPane)value;
                                pane.revalidate();
                                add(pane);
                            }
                        }
                    } catch (IOException exp) {
                        exp.printStackTrace();
                    }
                    Window window = SwingUtilities.windowForComponent(TestPane.this);
                    window.pack();
                    window.setLocationRelativeTo(null);
                }
            });
        }

    }

    public static class RandomButtonPane extends JPanel {

        public RandomButtonPane() {
            setLayout(new GridBagLayout());
        }

        public void randomise() {
            int count = ((int) (Math.random() * 100)) + 1;
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            for (int index = 0; index < count; index++) {
                if (index % 10 == 0) {
                    gbc.gridx = 0;
                    gbc.gridy++;
                }
                add(new JButton(Integer.toString(index)), gbc);
                gbc.gridx++;
            }
        }
    }

}

【讨论】:

  • 这对我有帮助,现在我知道该用什么了。
  • 我看到你有一个“加载”按钮,有没有办法让我在运行程序后立即加载按钮?
  • 当然,只需将加载按钮ActionListener中的代码放在一个方法中并调用它
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多