如何在两个JInternalFrame之间传递数据?

时间:2014-09-15 06:05:13

标签: java swing jinternalframe

我正在创建一个程序,我在这个框架中有一个带有JDesktopPane的JFrame,我打开了两个JInternalFrame,我希望在这两个JInternalFrame之间传递数据但是使用JTextField。 我刚刚传递数据,但它没有更新我想要显示的JInternalFrame。但如果我选择再次打开,它会向我显示数据。 请帮我! 致谢

在这个JInternalFrame 2中,我将数据发送到另一个JInternalFrame 1

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String word = jTxtIDACA.getText();
    DatosPersonales frame = new DatosPersonales();
    frame.getData(word);
    frame.setVisible(true);
    this.getDesktopPane().add(frame);
    this.dispose();

} 

这是JInternalFrame 1,我有

public void getData(String word){
    initComponents();
    this.word = word;
    jTxtIDACA.setText(word);

}

1 个答案:

答案 0 :(得分:4)

基本思路是你需要某种模型,它保存数据并使用Observer Pattern在模型以某种方式改变时向感兴趣的各方提供通知。

然后两个JInternalFrames将能够共享该模型,可以更新它,另一个可以监视它的变化(严格来说,这种关系可以双向工作,但我们将单独留下那一刻)...

Model

现在,因为我从不知道人们可能想要使用该模型的内容或方式,所以我总是从interface开始,并提供abstract实现和某种默认实现,如果我觉得它是需要....

public interface FruitBowl {

    public void addFruit(String fruit);
    public void removeFruit(String fruit);
    public List<String> getFruit();

    public void addFruitBowlListener(FruitBowlListener listener);
    public void removeFruitBowlListener(FruitBowlListener listener);

}

public abstract class AbstractFruitBowl implements FruitBowl {

    private EventListenerList listenerList;

    public AbstractFruitBowl() {
    }

    protected EventListenerList getEventListenerList() {
        if (listenerList == null) {
            listenerList = new EventListenerList();
        }
        return listenerList;
    }

    @Override
    public void addFruitBowlListener(FruitBowlListener listener) {
        getEventListenerList().add(FruitBowlListener.class, listener);
    }

    @Override
    public void removeFruitBowlListener(FruitBowlListener listener) {
        getEventListenerList().remove(FruitBowlListener.class, listener);
    }

    protected void fireFruitAdded(String fruit) {
        FruitBowlListener[] listeners = getEventListenerList().getListeners(FruitBowlListener.class);
        if (listeners.length > 0) {
            FruitBowlEvent evt = new FruitBowlEvent(this, fruit);
            for (FruitBowlListener listener : listeners) {
                listener.fruitAdded(evt);
            }
        }
    }

    protected void fireFruitRemoved(String fruit) {
        FruitBowlListener[] listeners = getEventListenerList().getListeners(FruitBowlListener.class);
        if (listeners.length > 0) {
            FruitBowlEvent evt = new FruitBowlEvent(this, fruit);
            for (FruitBowlListener listener : listeners) {
                listener.fruitRemoved(evt);
            }
        }
    }
}

public class DefaultFruitBowl extends AbstractFruitBowl {

    private List<String> fruits;

    public DefaultFruitBowl() {
        fruits = new ArrayList<>(25);
    }

    @Override
    public void addFruit(String fruit) {
        fruits.add(fruit);
        fireFruitAdded(fruit);
    }

    @Override
    public void removeFruit(String fruit) {
        fruits.remove(fruit);
        fireFruitRemoved(fruit);
    }

    @Override
    public List<String> getFruit() {
        return Collections.unmodifiableList(fruits);
    }

}

接下来,我们需要通过使用侦听器来定义观察者模式契约......

public class FruitBowlEvent extends EventObject {
    private String fruit;

    public FruitBowlEvent(FruitBowl fruitBowl, String fruit) {
        super(fruitBowl);
        this.fruit = fruit;
    }

    public FruitBowl getFruitBowl() {
        return (FruitBowl)getSource();
    }

    public String getFruit() {
        return fruit;
    }

}

public interface FruitBowlListener extends EventListener {

    public void fruitAdded(FruitBowlEvent evt);
    public void fruitRemoved(FruitBowlEvent evt);

}

接下来,我们定义UI ...

public class TestModel {

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

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

                FruitBowl fb = new DefaultFruitBowl();

                JDesktopPane dp = new JDesktopPane() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(400, 200);
                    }
                };
                JInternalFrame manager = new JInternalFrame("Fruit Bowl Manager", true, true, true, true);
                manager.add(new FruitBowelManagerPane(fb));
                manager.setVisible(true);
                manager.setBounds(0, 0, 200, 200);

                JInternalFrame monitor = new JInternalFrame("Fruit Bowl Monitor", true, true, true, true);
                monitor.add(new FruitBowelMonitorPane(fb));
                monitor.setVisible(true);
                monitor.setBounds(200, 0, 200, 200);

                dp.add(manager);
                dp.add(monitor);

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

    public abstract class AbstractFruitPane extends JPanel {

        private FruitBowl fruitBowl;

        public AbstractFruitPane(FruitBowl fruitBowl) {
            this.fruitBowl = fruitBowl;
        }

        public FruitBowl getFruitBowl() {
            return fruitBowl;
        }

    }

    public class FruitBowelManagerPane extends AbstractFruitPane {

        private String[] fruits = {"Banana", "Strewberry", "Pear", "Peach", "Orange"};

        private JButton giver;
        private JButton taker;

        public FruitBowelManagerPane(FruitBowl fruitBowl) {
            super(fruitBowl);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = 1;

            giver = new JButton("Add fruit");
            taker = new JButton("Remove fruit");
            taker.setEnabled(false);

            giver.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String fruit = fruits[(int)(fruits.length * Math.random())];
                    getFruitBowl().addFruit(fruit);
                    taker.setEnabled(true);
                }
            });
            taker.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    List<String> fruits = getFruitBowl().getFruit();
                    String eat = fruits.get((int)(fruits.size() * Math.random()));
                    getFruitBowl().removeFruit(eat);
                    if (getFruitBowl().getFruit().isEmpty()) {
                        taker.setEnabled(false);
                    }
                }
            });

            add(giver, gbc);
            add(taker, gbc);
        }

    }

    public class FruitBowelMonitorPane extends AbstractFruitPane {

        private JLabel label;

        public FruitBowelMonitorPane(FruitBowl fruitBowl) {
            super(fruitBowl);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            label = new JLabel("I'm watching you...");
            add(label);

            fruitBowl.addFruitBowlListener(new FruitBowlListener() {
                @Override
                public void fruitAdded(FruitBowlEvent evt) {
                    label.setText("You added " + evt.getFruit());
                }

                @Override
                public void fruitRemoved(FruitBowlEvent evt) {
                    if (getFruitBowl().getFruit().isEmpty()) {
                        label.setText("You ate all the fruit!");
                    } else {
                        label.setText("You ate my " + evt.getFruit());
                    }
                }
            });

        }

    }

}

更新了合并示例

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.EventListenerList;

public class TestModel {

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

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

                FruitBowl fb = new DefaultFruitBowl();

                JDesktopPane dp = new JDesktopPane() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(400, 200);
                    }
                };
                JInternalFrame manager = new JInternalFrame("Fruit Bowl Manager", true, true, true, true);
                manager.add(new FruitBowelManagerPane(fb));
                manager.setVisible(true);
                manager.setBounds(0, 0, 200, 200);

                JInternalFrame monitor = new JInternalFrame("Fruit Bowl Monitor", true, true, true, true);
                monitor.add(new FruitBowelMonitorPane(fb));
                monitor.setVisible(true);
                monitor.setBounds(200, 0, 200, 200);

                dp.add(manager);
                dp.add(monitor);

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

    public abstract class AbstractFruitPane extends JPanel {

        private FruitBowl fruitBowl;

        public AbstractFruitPane(FruitBowl fruitBowl) {
            this.fruitBowl = fruitBowl;
        }

        public FruitBowl getFruitBowl() {
            return fruitBowl;
        }

    }

    public class FruitBowelManagerPane extends AbstractFruitPane {

        private String[] fruits = {"Banana", "Strewberry", "Pear", "Peach", "Orange"};

        private JButton giver;
        private JButton taker;

        public FruitBowelManagerPane(FruitBowl fruitBowl) {
            super(fruitBowl);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = 1;

            giver = new JButton("Add fruit");
            taker = new JButton("Remove fruit");
            taker.setEnabled(false);

            giver.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String fruit = fruits[(int) (fruits.length * Math.random())];
                    getFruitBowl().addFruit(fruit);
                    taker.setEnabled(true);
                }
            });
            taker.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    List<String> fruits = getFruitBowl().getFruit();
                    String eat = fruits.get((int) (fruits.size() * Math.random()));
                    getFruitBowl().removeFruit(eat);
                    if (getFruitBowl().getFruit().isEmpty()) {
                        taker.setEnabled(false);
                    }
                }
            });

            add(giver, gbc);
            add(taker, gbc);
        }

    }

    public class FruitBowelMonitorPane extends AbstractFruitPane {

        private JLabel label;

        public FruitBowelMonitorPane(FruitBowl fruitBowl) {
            super(fruitBowl);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            label = new JLabel("I'm watching you...");
            add(label);

            fruitBowl.addFruitBowlListener(new FruitBowlListener() {
                @Override
                public void fruitAdded(FruitBowlEvent evt) {
                    label.setText("You added " + evt.getFruit());
                }

                @Override
                public void fruitRemoved(FruitBowlEvent evt) {
                    if (getFruitBowl().getFruit().isEmpty()) {
                        label.setText("You ate all the fruit!");
                    } else {
                        label.setText("You ate my " + evt.getFruit());
                    }
                }
            });

        }

    }

    public class FruitBowlEvent extends EventObject {

        private String fruit;

        public FruitBowlEvent(FruitBowl fruitBowl, String fruit) {
            super(fruitBowl);
            this.fruit = fruit;
        }

        public FruitBowl getFruitBowl() {
            return (FruitBowl) getSource();
        }

        public String getFruit() {
            return fruit;
        }

    }

    public interface FruitBowlListener extends EventListener {
        public void fruitAdded(FruitBowlEvent evt);
        public void fruitRemoved(FruitBowlEvent evt);
    }

    public interface FruitBowl {
        public void addFruit(String fruit);
        public void removeFruit(String fruit);
        public List<String> getFruit();
        public void addFruitBowlListener(FruitBowlListener listener);
        public void removeFruitBowlListener(FruitBowlListener listener);
    }

    public abstract class AbstractFruitBowl implements FruitBowl {

        private EventListenerList listenerList;

        public AbstractFruitBowl() {
        }

        protected EventListenerList getEventListenerList() {
            if (listenerList == null) {
                listenerList = new EventListenerList();
            }
            return listenerList;
        }

        @Override
        public void addFruitBowlListener(FruitBowlListener listener) {
            getEventListenerList().add(FruitBowlListener.class, listener);
        }

        @Override
        public void removeFruitBowlListener(FruitBowlListener listener) {
            getEventListenerList().remove(FruitBowlListener.class, listener);
        }

        protected void fireFruitAdded(String fruit) {
            FruitBowlListener[] listeners = getEventListenerList().getListeners(FruitBowlListener.class);
            if (listeners.length > 0) {
                FruitBowlEvent evt = new FruitBowlEvent(this, fruit);
                for (FruitBowlListener listener : listeners) {
                    listener.fruitAdded(evt);
                }
            }
        }

        protected void fireFruitRemoved(String fruit) {
            FruitBowlListener[] listeners = getEventListenerList().getListeners(FruitBowlListener.class);
            if (listeners.length > 0) {
                FruitBowlEvent evt = new FruitBowlEvent(this, fruit);
                for (FruitBowlListener listener : listeners) {
                    listener.fruitRemoved(evt);
                }
            }
        }
    }

    public class DefaultFruitBowl extends AbstractFruitBowl {

        private List<String> fruits;

        public DefaultFruitBowl() {
            fruits = new ArrayList<>(25);
        }

        @Override
        public void addFruit(String fruit) {
            fruits.add(fruit);
            fireFruitAdded(fruit);
        }

        @Override
        public void removeFruit(String fruit) {
            fruits.remove(fruit);
            fireFruitRemoved(fruit);
        }

        @Override
        public List<String> getFruit() {
            return Collections.unmodifiableList(fruits);
        }

    }
}