【问题标题】:JComboBox returning valuesJComboBox 返回值
【发布时间】:2012-03-15 11:18:05
【问题描述】:

用什么方法返回用户选择的选择?

JPanel ageSelection = new JPanel();
JLabel age = new JLabel("Age:");

ArrayList<Integer> ageList = new ArrayList<Integer>();

for (int i = 1; i <= 100; ++i) {
    ageList.add(i);
}

DefaultComboBoxModel<Integer> modelAge = new DefaultComboBoxModel<Integer>();
for (Integer i : ageList) {
    modelAge.addElement(i);
}

JComboBox<Integer> ageEntries = new JComboBox<Integer>();
ageEntries.setModel(modelAge);

ageEntries.addActionListener(new putInTextListener());

ageSelection.add(age);
ageSelection.add(ageEntries);


class putInTextListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        ageEntries.getSelectedItem();
    }
}

添加最后一行时(ageEntries.getSelectedItem();),出现错误:

线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常

有什么想法吗?

编辑代码:

class putInAgeListener implements ItemListener {
    public void itemStateChanged(ItemEvent e) {

        Object myAge = ageEntries.getSelectedItem();

        String myAgeData = myAge.toString();

        int i = Integer.parseInt(myAgeData);

        System.out.print(i);

    }
}

【问题讨论】:

    标签: java swing jcombobox java-7


    【解决方案1】:

    1) 此语句为空,您可能想从当前选定的Item 中获取Integer / Object / String

    Integer / Object / String myWhatever = ageEntries.getSelectedItem();
    

    2) 最好将ItemListener 用于JComboBox,而不是ActionListener,注意ItemListener 触发的事件SELECTED/DESELECTED,总是两次

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ComboBoxListeners {
    
        private JFrame f;
        private JComboBox flyFromCombo;
        private JComboBox flyToCombo;
        private JLabel tripLabel = new JLabel();
        private Object[] itemsFrom;
        private Object[] itemsTo;
    
        public ComboBoxListeners() {
            itemsFrom = new Object[]{"-", "First - From", "Second - From", "Third - From"};
            itemsTo = new Object[]{"-", "First - To", "Second - To", "Third - To"};
            //flyFromCombo.setPrototypeDisplayValue("################################################");
            flyFromCombo = new JComboBox(itemsFrom);
            flyFromCombo.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if ((e.getStateChange() == ItemEvent.SELECTED)) {
                        String str = flyFromCombo.getSelectedItem().toString();
                        String str1 = flyToCombo.getSelectedItem().toString();
                        setLabelText(str, str1);
                    }
                }
            });
            flyToCombo = new JComboBox(itemsTo);
            flyToCombo.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if ((e.getStateChange() == ItemEvent.SELECTED)) {
                        String str = flyFromCombo.getSelectedItem().toString();
                        String str1 = flyToCombo.getSelectedItem().toString();
                        setLabelText(str, str1);
                    }
                }
            });
            tripLabel.setPreferredSize(new Dimension(400, 30));
            f = new JFrame("ComboBox ItemListeners");
            f.setLayout(new GridLayout(0, 1, 15, 15));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(flyFromCombo);
            f.add(flyToCombo);
            f.add(tripLabel);
            f.setLocation(150, 150);
            f.pack();
            f.setVisible(true);
        }
    
        private void setLabelText(String str1, String str2) {
            String textForLabel = "";
            String helpStringFirst = str1.trim();
            if (helpStringFirst != null && helpStringFirst.length() > 0) {
                if (!helpStringFirst.equals("-")) {
                    textForLabel = "Flight No57. from :   " + helpStringFirst;
                } else {
                    textForLabel = "Flight from Un-Know :   ";
                }
            }
            String helpStringSecond = str2.trim();
            if (helpStringSecond != null && helpStringSecond.length() > 0) {
                if (!helpStringSecond.equals("-")) {
                    textForLabel = textForLabel + "   --> to :   " + helpStringSecond;
                } else {
                    textForLabel += "   to :   Un-Know    ";
                }
            }
            final String pushTextForLabel = textForLabel;
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    tripLabel.setText(pushTextForLabel);
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ComboBoxListeners comboBoxListeners = new ComboBoxListeners();
                }
            });
        }
    }
    

    编辑

    我没有(也不想要)JDK7,

    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import javax.swing.*;
    
    public class ComboBoxListeners {
    
        private JFrame f;
        private JComboBox flyFromCombo;
        private JLabel tripLabel = new JLabel();
    
        public ComboBoxListeners() {
            ArrayList<Integer> ageList = new ArrayList<Integer>();
            for (int i = 1; i <= 100; ++i) {
                ageList.add(i);
            }
            DefaultComboBoxModel modelAge = new DefaultComboBoxModel();
            for (Integer i : ageList) {
                modelAge.addElement(i);
            }
            flyFromCombo = new JComboBox(modelAge);
            flyFromCombo.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if ((e.getStateChange() == ItemEvent.SELECTED)) {
                        String str = flyFromCombo.getSelectedItem().toString();
                        tripLabel.setText("Selected Age From JComboBox is :   " + str);
                    }
                }
            });
            tripLabel.setPreferredSize(new Dimension(400, 30));
            f = new JFrame("ComboBox ItemListeners");
            f.setLayout(new GridLayout(0, 1, 15, 15));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(flyFromCombo);
            f.add(tripLabel);
            f.setLocation(150, 150);
            f.pack();
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ComboBoxListeners comboBoxListeners = new ComboBoxListeners();
                }
            });
        }
    }
    

    【讨论】:

    • 我仍然收到一个错误...我已对其进行了编辑,但仍然无法正常工作。问题可能出在 JComboBox 中的内容上吗?
    • 从哪一个你得到一个例外,有天上星星之类的选项,看我的编辑
    • 错误来自ageEntries.getSelectedItem();该行旨在获取用户选择的内容并将其放置在其他位置(如文本文件)。我编辑的代码是另一种尝试,但也失败了。
    【解决方案2】:

    作为参考,这里是 @mKorbel 的 example 的变体,它说明了在 Java 7 中添加到 JComboBoxComboBoxModel 的通用参数。它还使用了 Java 中可用的新 推理 功能7,这将在Type Inference for Generic Instance Creation 中进一步讨论。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /** @see https://stackoverflow.com/a/9440487/230513 */
    public class ComboBoxListener {
    
        private JFrame f = new JFrame("ComboBox ItemListener");
        private JPanel panel = new JPanel();
        private JComboBox<Integer> combo;
        private JLabel label = new JLabel("Please select a number from above.");
    
        public ComboBoxListener() {
            DefaultComboBoxModel<Integer> model = new DefaultComboBoxModel<>();
            for (int i = 1; i <= 100; ++i) {
                model.addElement(i);
            }
            combo = new JComboBox<>(model);
            combo.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if ((e.getStateChange() == ItemEvent.SELECTED)) {
                        Integer result = (Integer) combo.getSelectedItem();
                        label.setText(result.toString());
                    }
                }
            });
            f = new JFrame("ComboBox ItemListener");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            panel.setLayout(new GridLayout(0, 1, 5, 5));
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            panel.add(combo);
            panel.add(label);
            f.add(panel);
            f.setLocationByPlatform(true);
            f.pack();
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ComboBoxListener cbl = new ComboBoxListener();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多