JComboBox返回值

时间:2012-02-25 01:43:24

标签: java swing jcombobox java-7

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

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

    }
}

2 个答案:

答案 0 :(得分:5)

1)此声明为空,您可能希望从当前选定的Integer / Object / String

获取Item
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,

enter image description here

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

答案 1 :(得分:3)

作为参考,这里是@ 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();
            }
        });
    }
}