3

我试图在填充组合框后在我的类setSelectedItemJComboBox构造函数中设置 。JPanel

我设置了文本框的值,但我不知道为什么setSelectedItem似乎不起作用。有任何想法吗?

public StudentProfilePanel(StudentInfo si) {

        yesButton.setBounds(50, 346, 69, 40);
        noButton.setBounds(121, 346, 56, 40);
        this.add(yesButton);
        this.add(noButton);
        setLayout(null);
        comboBoxYear.setModel(new DefaultComboBoxModel(years()));
        comboBoxYear.setBounds(202, 365, 62, 23);
        if(si.birthdate!=null){
            //System.out.println("year value : ["+dateofbirth(si.birthdate)[2]+"]");
            comboBoxYear.setSelectedItem(dateofbirth(si.birthdate)[2]);

        }

        add(comboBoxYear);
        comboBoxMonth.setModel(new DefaultComboBoxModel(new String[]{"01","02","03","04","05","06","07","08","09","10","11","12"}));
        comboBoxMonth.setBounds(285, 365, 56, 23);

        //set month value
        if(si.birthdate!=null){
            //comboBoxMonth.setSelectedItem(dateofbirth(si.birthdate)[1]);
            comboBoxMonth.setSelectedItem("04");
            System.out.println("month value : ["+dateofbirth(si.birthdate)[1]+"]");
        }
        add(comboBoxMonth);
        comboBoxDay.setModel(new DefaultComboBoxModel(days()));
        comboBoxDay.setBounds(351, 365, 54, 23);
        if(si.birthdate!=null){
            //comboBoxDay.setSelectedItem(dateofbirth(si.birthdate)[0]);
            comboBoxDay.setSelectedItem(dateofbirth(si.birthdate)[0]);
        }
        add(comboBoxDay);

        textFieldFirstName = new JTextField();
        textFieldFirstName.setBounds(21, 321, 171, 21);
        add(textFieldFirstName);
        textFieldFirstName.setColumns(10);
        // set the value of first name
        textFieldFirstName.setText(si.firstName);

        textFieldLastName = new JTextField();
        textFieldLastName.setBounds(242, 321, 163, 21);
        add(textFieldLastName);
        textFieldLastName.setColumns(10);
        //set the value of the last name
        textFieldLastName.setText(si.lastName);

        JPanel panelPersonPhoto = new ImagePanel(
                "C:\\Users\\MDJef\\Pictures\\Wallpaper\\General\\11.jpg");
        panelPersonPhoto.setBorder(new TitledBorder(null, "",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        panelPersonPhoto.setBounds(21, 20, 384, 291);
        add(panelPersonPhoto);
    }

非常感谢。

我使用的辅助方法

    // jf : helper method
    public String[] years() {
        String[] results = new String[90];
        for (int i = 0; i < 90; i++) {
            results[i] = Integer.toString(1900 + i);
        }
        return results;
    }

    // jf : helper method
    public String[] months() {
        String[] results = new String[12];
        for (int i = 0; i < 12; i++) {
            results[i] = Integer.toString(i + 1);
        }
        return results;
    }

    // jf : helper method
    public String[] days() {
        String[] results = new String[31];
        for (int i = 0; i < 31; i++) {
            results[i] = Integer.toString(i + 1);
        }
        return results;
    }

    // jf : helper method
    public String[] dateofbirth(String dob) {
        String[] tokens = dob.split("-");
        return tokens;
    }
4

6 回答 6

2

分配给组合框的值与您尝试设置的值不同。

例如,年份是String从 1900 年到 1990 年,但如果我提供一个 value 72,则组合框中没有匹配的值可以匹配。

同样,您的daysmonths方法仅返回未填充的值(即01),而在您的代码中,您尝试使用填充值(即04)设置值,这意味着没有匹配的值...

你有很多选择...

你可以...

将所有值转换为int,这意味着组合框中的值只是ints。然后,您还需要将日期值转换为ints。

这将使您的帮助代码看起来更像...

public int[] years() {
    int[] results = new String[90];
    for (int i = 0; i < 90; i++) {
        results[i] = 1900 + i;
    }
    return results;
}

public int[] months() {
    int[] results = new String[12];
    for (int i = 0; i < 12; i++) {
        results[i] = i + 1;
    }
    return results;
}

public int[] days() {
    int[] results = new String[31];
    for (int i = 0; i < 31; i++) {
        results[i] = i + 1;
    }
    return results;
}

public int[] dateofbirth(String dob) {
    int[] tokens = dob.split("-");
    int[] values = new int[tokens.length];
    for (int index = 0; index < tokens.length; index++) {
      values[index] = Integer.parse(tokens[index]);
    }
    return index;
}

更好的解决方案

将使用 a JSpinner,它将自动处理日期滚动问题和验证。

查看使用标准微调器模型和编辑器

于 2013-05-26T08:50:25.760 回答
1

与您的问题无关,但是:

yesButton.setBounds(50, 346, 69, 40);
noButton.setBounds(121, 346, 56, 40);
setLayout(null);

不要使用空布局和 setBounds(...)。Swing 旨在与布局管理器一起使用。从长远来看,您将节省时间。

if(si.birthdate!=null){

不要直接访问类中的变量。创建一个 getter 方法来访问您的类的属性。

//System.out.println("year value : ["+dateofbirth(si.birthdate)[2]+"]");
comboBoxYear.setSelectedItem(dateofbirth(si.birthdate)[2]);

不要总是试图强迫你把代码写成一条语句。相反,请执行以下操作:

String birthdate = dateofbirth(si.birthdate[2]);
System.out.println("year value : [" + birthdate +"]");
comboBoxYear.setSelectedItem(birthdate);

这有助于您的调试,因为现在您知道所显示的变量与您尝试在 setSelectedItem() 方法中使用的变量相同。它节省了两次键入语句并避免键入错误。

于 2013-05-26T05:16:05.067 回答
1

当您打电话时,comboBoxMonth.setSelectedItem("04");您尝试选择一个新创建的字符串,该字符串不等于您的JComboBox. 因此它没有被选中。

您可以尝试这样的事情:

String[] months = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"};
comboBoxMonth.setModel(new DefaultComboBoxModel(months));

comboBoxMonth.setSelectedItem(months[3]);

编辑:试试这个。它改为使用项目的索引。只需确保将月份添加到数组中即可。

String[] months = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"};
comboBoxMonth.setModel(new DefaultComboBoxModel(months));

if(si.birthdate!=null)
{
    comboBoxMonth.setSelectedIndex(Integer.parseInteger(dateofbirth(si.birthdate)[1]) - 1);
}
于 2013-05-26T05:10:39.693 回答
0

使用以下内容: comboBoxMonth.setSelectedItem(index of the array);

于 2013-05-26T05:38:44.197 回答
0

对于具有相同问题的其他开发人员:仔细研究setSelectedItem(Object anObject)from的实现JComboBox可能会有所帮助:

public void setSelectedItem(Object anObject) {
    Object oldSelection = selectedItemReminder;
    Object objectToSelect = anObject;
    if (oldSelection == null || !oldSelection.equals(anObject)) {

        if (anObject != null && !isEditable()) {
            // For non editable combo boxes, an invalid selection
            // will be rejected.
            boolean found = false;
            for (int i = 0; i < dataModel.getSize(); i++) {
                E element = dataModel.getElementAt(i);
                if (anObject.equals(element)) {
                    found = true;
                    objectToSelect = element;
                    break;
                }
            }
            if (!found) {
                return;
            }
        }

...

在循环中,您的对象与具有特定类型的 dataModel 对象进行比较E。在 String 中 equals() 的实现中,您可以看到类/接口、长度和每个字符一个接一个的验证。这意味着,我们的对象必须具有相同的类型,并且所有字符必须相同!

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这是最烦人的if (anObject.equals(element))部分 setSelectedItem!您不能从元素中覆盖 equals 方法。例如StudentInfo并将其他类型(如字符串或整数)与它进行比较。简单的例子。您像这样实现组合框,JComboBox<StudentInfo>并且想要选择带有int id = 2;. 所以它现在Integer与比较StudentInfo。在这里,您必须从Integer...覆盖 equals

我的建议是交换它。创建自己的类,添加boolean selectingItem和覆盖setSelectedItem(Object anObject)contentsChanged(ListDataEvent e)(此方法一对一)。尽管如此,我在一个项目中有副作用......

于 2016-09-13T20:54:31.123 回答
0

您希望设置为选中的项目必须共享存储在 JComboBox 中的对象的类。

public static void main(String[] args) {
    String[] items = {"1", "2", "3"};
    JComboBox jcb = new JComboBox(items);
    jcb.setSelectedItem(3);
    System.out.println(jcb.getSelectedItem());
    jcb.setSelectedItem(3+"");
    System.out.println(jcb.getSelectedItem());
}

上述代码的输出:

1
3
于 2019-11-16T18:09:06.987 回答