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

Java 如何在两个JInternalFrame之间传递数据?,java,swing,jinternalframe,Java,Swing,Jinternalframe,我正在做一个程序,我有一个JFrame和JDesktopPane,在这个框架中,我打开了两个JInternalFrame,我想在这两个JInternalFrame之间传递数据,但是使用JTextField。 我只是想传递数据,但它不会更新我想要显示的JInternalFrame。但如果我选择再次打开,它会显示数据。 请帮帮我! 谢谢 在这个JInternalFrame 2中,我将数据发送到另一个JInternalFrame 1 private void jButton1ActionPerform

我正在做一个程序,我有一个JFrame和JDesktopPane,在这个框架中,我打开了两个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);

}

基本思想是您需要某种模型,该模型保存数据并用于在模型以某种方式更改时向相关方提供通知

两个
jinternalframe
将能够共享该模型,一个可以更新它,另一个可以监控它的变化(严格地说,这种关系可以双向运行,但我们暂时不谈这一点)

现在,因为我不知道人们可能喜欢使用什么或如何使用该模型,我总是从一个
接口开始,然后提供一个
抽象的
实现和一些默认的实现,如果我觉得需要的话

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);
    }

}
接下来,我们定义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());
                    }
                }
            });

        }

    }

}
公共类测试模型{
公共静态void main(字符串[]args){
新的TestModel();
}
公共测试模型(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
水果碗fb=新的默认水果碗();
JDesktopPane dp=新JDesktopPane(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400200);
}
};
JInternalFrame manager=新的JInternalFrame(“水果碗管理器”,真,真,真,真);
添加(新的果味鲍威尔管理烷(fb));
manager.setVisible(true);
经理.挫折(0,0,200,200);
JInternalFrame监视器=新的JInternalFrame(“水果碗监视器”,真,真,真,真);
监测.添加(新的Bourbowlmonitorpane(fb));
monitor.setVisible(true);
监视器.立根(200,0,200,200);
dp.add(经理);
dp.add(监视器);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧。添加(dp);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共抽象类AbstractFruitPane扩展了JPanel{
私人果园;
公共抽象果盘(果盘果盘){
this.fruitBowl=果盘;
}
公共果园{
返回果盘;
}
}
公共类FruitBowlManagerPane扩展AbstractFruitPane{
私有字符串[]水果={“香蕉”、“草莓”、“梨”、“桃”、“橙”};
私人钮扣给予者;
私人布顿接受者;
公共果园管理器(果园果园){
超级(水果碗);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=1;
给予者=新的按钮(“添加水果”);
接受者=新钮扣(“去除水果”);
taker.setEnabled(false);
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
字符串fruit=fruits[(int)(fruits.length*Math.random())];
获取水果碗()。添加水果(水果);
taker.setEnabled(true);
}
});
taker.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
列出水果=getFruitBowl().getFruit();
字符串eat=fruits.get((int)(fruits.size()*Math.random());
获取水果碗()。移除水果(吃);
如果(GetFruitbool().getFruit().isEmpty()){
taker.setEnabled(false);
}
}
});
添加(给予者,gbc);
新增(投标人、gbc);
}
}
公共级果味素Bowlmonitorpane扩展了果味素窗格{
私人标签;
公共果园硝基苯甲酸(果园果园){
超级(水果碗);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
label=新的JLabel(“我在看你…”);
添加(标签);
addFruitBowlListener(新的FruitBowlListener(){
@凌驾
已添加公共事件(事件evt){
label.setText(“您添加了”+evt.getFruit());
}
@凌驾
已删除公共活动(活动evt){
如果(GetFruitbool().getFruit().isEmpty()){
label.setText(“你吃了所有的水果!”);
}否则{
label.setText(“你吃了我的”+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);
        }

    }
}
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.Actio
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);
        }

    }
}