如何使我的MouseListeners在反序列化JPanel的工作吗?(How to make my

2019-10-29 13:33发布

我写一个程序:

  1. 创建一个JPanel包含可一些形状物体MouseDragged左右。
  2. 保存在二进制文件中这一类的对象与ObjectOutputStream
  3. 检索从二进制文件(与对象ObjectInputStream ),并增加了它在一个JFrame

我的问题是,我以后JPanel被检索(因此反序列化,我把它),并添加到我JFrame ,我不能MouseDrag我的形状了。 没有点击操作的实际工作。

我的老师告诉我,我可以通过解决这个问题validate()方法,虽然我不是很确定为如何做到这一点。

Answer 1:

你看不到变化的原因,是该类别的听众(即使序列,这可能是这种情况),也没有要他们应该是在与对方接触的对象的引用。 此外,他们没有被重新附连到他们被串行化之前附连到的组件。

作为一个例子,下面的例子不会与系列化工作,因为听众做一些事情,以“面板”,但没有办法听众可以“重新连接”来反序列化后的按钮,以及要注意的“谁”面板:

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

public class MyPanel extends JPanel {
    private JPanel innerPanel;
    private JLabel label;
    private JButton button;

    public MyPanel() {
        super(new BorderLayout(10, 10));

        innerPanel = new JPanel(new BorderLayout());
        innerPanel.add(label = new JLabel("PANEL"), BorderLayout.CENTER);

        button = new JButton("Remove label");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                panel.remove(label);
            }
        });

        add(innerPanel, BorderLayout.CENTER);
        add(button, BorderLayout.PAGE_END);
    }
}


文章来源: How to make my MouseListeners work in a deserialized JPanel?