【问题标题】:How to add Items to JList from another window如何从另一个窗口将项目添加到 JList
【发布时间】:2013-03-28 16:29:19
【问题描述】:

我有 2 个窗口。一个有一个空的 JList,另一个有一个按钮。所以我想在按下按钮时将值添加到列表中。这是我的代码,但未完成:

窗口 1

final DefaultListModel<String> favouriteNames = new DefaultListModel<String>();
JList namesList = new JList(favouriteNames);

窗口 2

public class button extends JFrame {

private JList namesList;
private DefaultListModel<String> favouriteNames;

this.namesList = namesList;

 JButton addThis = new JButton("Add");
 addThis.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
          favouriteNames.addElement("Jack");
   }
 });
}
}

【问题讨论】:

    标签: java swing jbutton actionlistener jlist


    【解决方案1】:

    将 DefaultListModel 的实例传递给构造函数中的 Window 2。

    编辑添加:这是在构造函数中传递实例的方式。

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class ButtonFrame implements Runnable {
    
        private JFrame              frame;
    
        private DefaultListModel    favouriteNames;
    
        public ButtonFrame(final DefaultListModel favouriteNames) {
            this.favouriteNames = favouriteNames;
        }
    
        @Override
        public void run() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JButton addThis = new JButton("Add");
            addThis.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    favouriteNames.addElement("Jack");
                }
            });
    
            frame.add(addThis);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new ButtonFrame(new DefaultListModel()));
        }
    
    }
    

    【讨论】:

    • 感谢您的回复。不知道该怎么做,但这是我的想法和错误:Window1 favouriteNames; 在动作监听器中我得到 addElement 被突出显示,这是错误:方法 addElement(String) 未定义为 Frame 类型。
    • 感谢您的回复和时间。但它不起作用。当我按下按钮时没有任何反应。没有任何错误,但没有添加到列表中。
    • 顺便说一句,我应该编辑窗口 1 吗?实际列表所在的类。
    • @AlexJj:你真的不应该有 2 个窗口。大量的初学者想要立即制作极其复杂的 GUI 而不花时间学习基础知识,这让我感到非常沮丧。
    • 嗯,我正在处理的程序比这个例子更大,它有 4 个不同的类。所以我只是将它简化为更小的部分以使其更容易。我的问题的全部意义在于传递来自不同类的变量和控制组件。
    【解决方案2】:

    我制作了一个更简单的程序版本,但仍然存在问题,我相信 ActionPerformed 发送了数据,但 JList 无法识别它,或者基本上没有预料到会收到它。所以这就是我到目前为止所做的。所以这是我的更多研究和尝试,也许它提供了有关问题的更多细节。

    主窗口:

    public class main {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            JFrame frame = new ClassA();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
        }
    
    }
    

    A 类:

    public class ClassA extends JFrame {
    
            DefaultListModel<String> myList;
            JList list;
    
            public ClassA() {
    
            setSize(300,200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(2,1));
    
            myList = new DefaultListModel<String>();
            list = new JList(myList);
    
    
            //ClassB sendsText = new ClassB(myList, list);
    
            JButton find = new JButton("Find");
            find.addActionListener(new ActionListener(){
    
                public void actionPerformed(ActionEvent e) {
                    new ClassB().setVisible(true);
                }
    
            });
    
    
            add(panel);
            panel.add(find);
            panel.add(list);
        }
    
    }
    

    B 类:

    public class ClassB extends JFrame {
    
        DefaultListModel<String> myList;
        JList list;
        public ClassB(DefaultListModel<String> myList, JList list){
            this.myList = myList;
            this.list = list;
        }
    
    
        public ClassB() {
            setSize(300,200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(2,1));
    
            JButton addMe = new JButton("Add Me");
            addMe.addActionListener(new ActionListener(){
    
                public void actionPerformed(ActionEvent e) {
                    myList.addElement("Danial");
    
                }
    
            });
    
            add(panel);
            panel.add(addMe);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多