在 Swing 中绑定组合框

发布于 2024-10-17 02:10:32 字数 963 浏览 5 评论 0原文

我正在使用 Eclipse IDE 开发桌面(swing)应用程序。我有三个组合框(国家、州和城市),当我选择新的国家或省份时,我需要自动更新数据。我搜索了很多信息,但我找到的所有实现都是在Ajax或NetBeans中的bean绑定框架上实现的。 我尝试了 ItemEvent 的解决方案,但启动应用程序时遇到问题,它加载国家/地区列表,但不加载其他列表。通过选择国家,系统会显示州列表,但不会显示城市列表。

我的代码:

    jComboBoxCountries.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBoxStates.setModel(new javax.swing.DefaultComboBoxModel(
                    statesOf(evt.getItem()).toArray() ));
            }
        });

    jComboBoxStates.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboBoxCities.setModel(new javax.swing.DefaultComboBoxModel(
                    citiesOf(evt.getItem()).toArray()) );
            }
    });

    jComboBoxCountries.setModel(new javax.swing.DefaultComboBoxModel(
            countryList.toArray()));

I'm working on a desktop (swing) application with Eclipse IDE. I have three comboboxes (countries, states and cities) and I need to update the data automatically when I selecting a new country or province. I searched lot of information, but all the implementations I found are made on Ajax or the beansbinding framework in NetBeans.
I tried a solution by ItemEvent, but I have problems starting my application it loads the list of countries but not the other lists. And by selecting a country is charged the list of states but not the list of cities.

My code:

    jComboBoxCountries.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
            jComboBoxStates.setModel(new javax.swing.DefaultComboBoxModel(
                    statesOf(evt.getItem()).toArray() ));
            }
        });

    jComboBoxStates.addItemListener(new java.awt.event.ItemListener() {
        public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboBoxCities.setModel(new javax.swing.DefaultComboBoxModel(
                    citiesOf(evt.getItem()).toArray()) );
            }
    });

    jComboBoxCountries.setModel(new javax.swing.DefaultComboBoxModel(
            countryList.toArray()));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月依秋水 2024-10-24 02:10:32

我在启动应用程序时遇到问题,它加载国家/地区列表,但不加载其他列表

似乎您必须专门设置选定的索引才能调用侦听器。

jComboBoxCountries.setModel(...)
jComboBoxCountries.setSelectedIndex(0);

通过选择一个国家/地区,会显示州列表,但不会显示城市列表。

我猜这是同样的问题,一旦您重置状态组合框的模型,您还需要选择其索引。

另一种方法是不选择默认的州或城市,而是提示用户选择一个。下面是一些使用这种方法的代码:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener
{
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable subItems = new Hashtable();

    public ComboBoxTwo()
    {
        String[] items = { "Select Item", "Color", "Shape", "Fruit" };
        mainComboBox = new JComboBox( items );
        mainComboBox.addActionListener( this );

        //  prevent action events from being fired when the up/down arrow keys are used
//      mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add( mainComboBox, BorderLayout.WEST );

        //  Create sub combo box with multiple models

        subComboBox = new JComboBox();
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        getContentPane().add( subComboBox, BorderLayout.EAST );

        String[] subItems1 = { "Select Color", "Red", "Blue", "Green" };
        subItems.put(items[1], subItems1);

        String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" };
        subItems.put(items[2], subItems2);

        String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" };
        subItems.put(items[3], subItems3);
        mainComboBox.setSelectedIndex(1);
    }

    public void actionPerformed(ActionEvent e)
    {
        String item = (String)mainComboBox.getSelectedItem();
        Object o = subItems.get( item );

        if (o == null)
        {
            subComboBox.setModel( new DefaultComboBoxModel() );
        }
        else
        {
            subComboBox.setModel( new DefaultComboBoxModel( (String[])o ) );
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}

I have problems starting my application it loads the list of countries but not the other lists

It seems like you have to specifically set the selected index to invoke the listener.

jComboBoxCountries.setModel(...)
jComboBoxCountries.setSelectedIndex(0);

And by selecting a country is charged the list of states but not the list of cities.

I would guess this is the same problem, once you reset the model of the states combobox you would need to select its index as well.

Another approach is to not select a default state or city, but instead prompt the user to select one. Here is some code that uses this approach:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener
{
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable subItems = new Hashtable();

    public ComboBoxTwo()
    {
        String[] items = { "Select Item", "Color", "Shape", "Fruit" };
        mainComboBox = new JComboBox( items );
        mainComboBox.addActionListener( this );

        //  prevent action events from being fired when the up/down arrow keys are used
//      mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add( mainComboBox, BorderLayout.WEST );

        //  Create sub combo box with multiple models

        subComboBox = new JComboBox();
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        getContentPane().add( subComboBox, BorderLayout.EAST );

        String[] subItems1 = { "Select Color", "Red", "Blue", "Green" };
        subItems.put(items[1], subItems1);

        String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" };
        subItems.put(items[2], subItems2);

        String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" };
        subItems.put(items[3], subItems3);
        mainComboBox.setSelectedIndex(1);
    }

    public void actionPerformed(ActionEvent e)
    {
        String item = (String)mainComboBox.getSelectedItem();
        Object o = subItems.get( item );

        if (o == null)
        {
            subComboBox.setModel( new DefaultComboBoxModel() );
        }
        else
        {
            subComboBox.setModel( new DefaultComboBoxModel( (String[])o ) );
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文