ComboBoxModel 事件不起作用

2024-04-20

我似乎不理解事件等概念。在阅读了有关如何实现侦听器等内容的一段时间后,我发现 Java 教程说我应该扩展AbstractListModel触发数据事件。由于某种原因它仍然不起作用。

我做错了什么吗?

以及预计会出现什么样的代码addListDataListener(ListDataListener l)让它发挥作用?因为我也不明白这一点。

public class CarComboBox extends AbstractListModel<Object> implements ComboBoxModel<Object> {

    private JdbcRowSet jdbc;
    private int size = 0;
    private String selection;

    public CarComboBox() {
        try {
            jdbc = new Query().getCarInfo();

            jdbc.beforeFirst();
            while (jdbc.next()) {
                size++;
            }
            jdbc.beforeFirst();
        }
        catch (SQLException ex) {
            System.err.println(ex.toString());
        }
    }

    @Override
    public void setSelectedItem(Object anItem) {
        selection = (String) anItem;
    }

    @Override
    public Object getSelectedItem() {
        return selection;
    }

    @Override
    public void addListDataListener(ListDataListener l) {
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
    }

    @Override
    public int getSize() {
    return size;
    }

    @Override
    public String getElementAt(int index) {
        try {
            jdbc.absolute(index + 1);
            return jdbc.getString(2);
        }
        catch (SQLException ex) {
            System.out.println(ex.toString());
        }
        return null;
    }
}

要将侦听器添加到 CarComboBox,我执行以下操作:

CarComboBox ccb = new CarComboBox();
ccb.addListDataListener(new ListDataListener()

我猜你用的是官方的tutorial http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html.

但是,您不应该接触 ListModel 和 ComboBoxModel。这些是您可能不需要的更高级功能。 本教程中的 4 个示例不使用 ListModel 和 ComboBoxModel。

如果您使用标准 JComboBox(无 ListModel 或 ComboBoxModel),那么当有人进行选择时,会出现一个ActionEvent被解雇了。这个事件是由 Swing 神奇地触发的;您不必担心它是如何生成的。然而,您的责任是让一些(零个、一个或多个)对象能够接收 ActionEvent 并对其执行某些操作:

public class MyClass implements ActionListener {
   JComboBox comboBox = ...;

   ...
       // You must register explicitly every ActionListener that you
       // want to receive ActionEvent's from comboBox.
       // Here we register this instance of MyClass.
       comboBox.addActionListener(this);
   ...

   @Override 
   public void actionPerformed(ActionEvent e) {
      if (e.getSource() instanceof JComboBox) {
         System.out.println("MyClass registered an ActionEvent from a JComboBox.");
         System.out.println("Selected: " + 
               ((JComboBox) e.getSource()).getSelectedItem());
      }
   }
}

请注意,如果您没有由不同的 Swing 组件触发任何其他 ActionEvent,则您可以 可以跳过if (e.getSource() instanceof JComboBox)因为您知道您的 ActionEvent 始终来自 JComboBox。

在我的示例中,JComboBox 位于 MyClass 内部,但它不一定是:

JComboBox comboBox = ...;
MyClass myClass = ...;
comboBox.addActionListener(myClass);
...
comboBox.addActionListener(someOtherActionListener);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ComboBoxModel 事件不起作用 的相关文章

随机推荐