当前位置: 首页 > 知识库问答 >
问题:

如何实现自定义DefaultComboBoxModel

方嘉言
2023-03-14

我需要实现我的自定义DefaultComboxModel。这样做的原因是每次我打电话给

DefaultComboBoxModel model = (DefaultComboBoxModel)getModel();
model.removeAllElements();

或者

model.addElement(Object);

或者

model.insertElementAt(Object,int)

我看到它自动触发一个项目状态更改事件。这会导致一些随机项目自动从列表中选择。这不是我想要的,因为它用随机选择的项目填充可编辑的JTextField。

这是我在使用我的自定义Itemlistener中的Thread.dumpStack()进行调试时看到的stacktrace,它是我在调用上述方法时看到的:

at javax.swing.JComboBox.fireItemStatehanged(Unknown source) 
at javax.swing.JComboBox.selectedItemChanged(Unknown source)
at javax.swing.JComboBox.contentsChanged(Unknown source)
at javax.swing.JComboBox.fireContentsChanged(Unknown source)
at javax.swing.JComboBox.setSelectedItem(Unknown source)
at javax.swing.JComboBox.addElement(Unknown source)

在更新模型之前和模型更新之后,我已经尝试使用setSelectedIndex(-1),但还是出现了同样的问题。我想有我的定制模型是正确的选择。

问题是如何实现我的自定义组合框模型?我只是扩展DefaultComboBoxModel吗?我必须覆盖DefaultComboBoxMode中的所有方法吗?

以下是我目前掌握的情况。但是如果你看到下面,我没有引用实际的向量列表来删除这个项目。如果我在我的自定义AutocompleteComboBoxModel中声明了一个Vector列表字段,那么我需要重写所有方法以避免其他SWING代码引用超类中的Vector吗?

请记住,我的目标是永远不允许模型自动调用setSelectedItem(Object),因为这似乎会导致问题,除非有更好的方法。

public class AutocompleteComboBoxModel extends DefaultComboBoxModel{

    public void removeElementAt(int index){
        list.removeElementAt(index);
        fireIntervalRemoved(this, index, index);
    }

}

这也是我如何调用执行模型操作的方法:

public class AutocompleteDocumentListener implementts DocumentListener{
    JTextField tf;

    public AutocompleteDocumentListener (JTextfield tf){
        this.tf = tf;
    }
    @Override
    public void changedUpdate(DocumentEvent e){
    }

    @Override
    public void insertUpdate(DocumentEvent e){
        update();
    }
    @Override
    public void removeUpdate(DocumentEvent e){
       update();
    }

    public void update(){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                performSearch(tf.getText());//Search user input
            }
          )
        }

    }

编辑:我只想提一下,这种奇怪的行为只有在我打字非常快的时候才会发生。如果输入慢,则SWING不会自动选择随机项。那幺如果我使用Swinguties,为什么在快速打字时会出现这种情况呢。召唤者?目前,当SWING调用setSelectedItem(对象)时,该激发事件是否会在其他调用器请求之前执行

编辑:我正在删除ItemListener但仍然不工作。然后我继续前进并删除了JComboBox KeyListeners、ActionListeners、ComponentListeners和Focus usListeners,它仍然自动选择项目。似乎在调用稍后完成后的某个时间,我看到项目被选中,可能是因为我还在JTextField上输入:

java.lang.Exception: Stack trace
    at java.lang.Thread.dumpStack(Unknown Source)
    at com.artificialmed.coderdx.encoder.TermSelectionListener.itemStateChanged(TermSelectionListener.java:23)
    at javax.swing.JComboBox.fireItemStateChanged(Unknown Source)
    at javax.swing.JComboBox.selectedItemChanged(Unknown Source)
    at javax.swing.JComboBox.contentsChanged(Unknown Source)
    at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
    at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
    at javax.swing.JComboBox.selectWithKeyChar(Unknown Source)
    at javax.swing.plaf.basic.BasicComboBoxUI$Handler.keyPressed(Unknown Source)
    at java.awt.Component.processKeyEvent(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at javax.swing.JComboBox.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

提前感谢。

共有1个答案

咸疏珂
2023-03-14

添加元素(...)或insertElementAt(...)方法不应导致生成ItemStateChanged事件,因为选择不应更改。

RemveAll()元素将导致所选项目未被选中,因此生成事件是有意义的。

几个解决方案:

> < li>

仅处理“项目选择”事件。这样,当您移除所有项目时,您会忽略“取消选择项目”事件。

在状态更改时调用的逻辑中,代码应调用 getSelectedItem()。如果此值为 null,则不执行任何操作。

a) 移除侦听器,b)调用removeAll()方法,c)添加侦听器。由于调用removeAll()方法时侦听器不存在,因此不会生成任何事件。

 类似资料:
  • 我正在使用Spring开发一个应用程序。在Access Control Access一节中,我想使用Spring Security Acl(我是Acl的新手)。我想在我的应用程序中实现ACL基于两点: 应用程序应该具有以下五种权限:、、、和。 权限是分层的,当用户具有权限时,它应该能够,或者当用户具有权限时,它应该能够、和等。 更新: 我的应用程序是基于Spring MVC RESTful的。当用

  • 问题内容: 作为一个例子,取子域映射。 然后,映射将如下所示: 如果我们想创建自定义的@RequestMapping属性,例如子域。创建这样的映射: 我们应该使用我们自己的实现覆盖定义并覆盖RequestMappingHandlerMapping受保护的方法 (如JIRA所述:“ 允许自定义请求映射条件SPR-7812 ”)。 这样对吗?有人可以提供提示,如何实现此功能吗? 想法1: 正如原始的j

  • 本文:在Google App Engine上管理同一应用程序的多个域和子域,建议在筛选器上解析子域,并将变量分配给ServletRequest头。 那么映射将如下所示: 如果我们想创建自定义的@RequestMapping属性,比如subdomain,例如。要创建如下所示的映射: 也许像这样的类型和方法映射是可能的解决方案? 链接到forum.springsource.com上的相同问题

  • 本文向大家介绍Java如何实现自定义异常类,包括了Java如何实现自定义异常类的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自定义异常类步骤   创建一个类继承异常父类Exception   在具体的实现方法首部抛出异常类(自己创建的那个类),throws的

  • 问题内容: 我解析了.yaml文件,需要以自定义方式解组其属性之一。我正在使用包裹。 有问题的属性按如下方式存储在我的.yaml文件中: 因此,它基本上是一种类型。 但是我需要在哪里定义为: 我的结构: 我试图像这样实现Unmarshaler接口: 我的问题是在函数内部未定义类型,从而在运行时导致nil指针异常。 我如何在此处正确实现Unmarshaler接口? 问题答案: 由于@Volker并未

  • 本文向大家介绍如何在jQuery中实现自定义事件?,包括了如何在jQuery中实现自定义事件?的使用技巧和注意事项,需要的朋友参考一下 自定义事件意味着您可以在jQuery中创建自己的事件。例如,创建一个自定义事件以在按下键盘上的任意键时触发警报框。 示例 您可以尝试运行以下代码以了解如何创建自定义事件,