ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-SwingX AutoCompleteDecorator JTextField错误

2019-10-30 16:01:10  阅读:283  来源: 互联网

标签:swingx swing autocomplete jtextfield java


我正在测试SwingX AutoCompleteDecorator,我使用的代码是这样的:

import javax.swing.text.JTextComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JList;

import org.jdesktop.swingx.autocomplete.*;

public class Test extends JFrame
{
    public Test()
    {
        this.setTitle("Testing");
        JPanel pan = new JPanel();
        JTextComponent test = new JTextField();
        ((JTextField)test).setColumns(20);
        String[] data = {"one", "two", "three", "four"}; 
        JList dataList = new JList(data); 
        AutoCompleteDecorator.decorate(dataList, test);
        pan.add(test);
        this.setContentPane(pan);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setBounds(280,150,500,200);

    }
    public static void main(String[] args)
    {
        Test t = new Test();
    }
}     

我最终收到大量运行时错误消息,我真的不想为线程“ AWT-EventQueue-0” java.lang.NullPointerException中的异常发布堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at org.jdesktop.swingx.autocomplete.ListAdaptor.valueChanged(ListAdaptor.java:77)
    at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
    at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:405)
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:415)
    at javax.swing.DefaultListSelectionModel.setSelectionInterval(DefaultListSelectionModel.java:459)
    at javax.swing.JList.setSelectedIndex(JList.java:2212)
    at javax.swing.JList.setSelectedValue(JList.java:2362)
    at org.jdesktop.swingx.autocomplete.ListAdaptor.setSelectedItem(ListAdaptor.java:99)
    at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.setSelectedItem(AutoCompleteDocument.java:355)
    at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:303)
    at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1386)
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:884)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
    at java.awt.Component.processEvent(Component.java:6282)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
    at java.awt.Component.dispatchEventImpl(Component.java:4731)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:702)
    at java.awt.EventQueue$4.run(EventQueue.java:700)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

我错过了什么?

解决方法:

这是一个错误:罪魁祸首是使用两个参数的方法用JList的项修饰textComponent的ObjectToStringConverter为空:

public static void decorate(JList list, JTextComponent textComponent) {
    decorate(list, textComponent, null);
}

一种快速解决方案是使用三参数方法并传入默认转换器:

JTextComponent test = new JTextField(20);
String[] data = {"one", "two", "three", "four"}; 
JList dataList = new JList(data); 
AutoCompleteDecorator.decorate(dataList, test, ObjectToStringConverter.DEFAULT_IMPLEMENTATION);

归档Issue #1570-自版本#4305起固定

早上冥想(可以放心地忽略:-)

技术原因是不正确的构造函数链接:插入默认值应由“全部完成”构造函数处理(或者,它应该抛出NPE)

public ListAdaptor(JList list, JTextComponent textComponent) {
    this(list, textComponent, ObjectToStringConverter.DEFAULT_IMPLEMENTATION);
}

public ListAdaptor(JList list, JTextComponent textComponent, ObjectToStringConverter stringConverter) {
    this.list = list;
    this.textComponent = textComponent;
    this.stringConverter = stringConverter;
    // when a new item is selected set and mark the text
    list.addListSelectionListener(this);
}

根本原因是转换器的所有权发生了细微的变化:它的通常所有者是处理autoComplete的自定义文档,该文档保护自己免受null的影响.对于JList变体,它的ListAdaptor不习惯这种负担…转换并非不正确(实际上,确切的处理方法),只是引入了一个非常细微的不一致之处,很容易忽略.

标签:swingx,swing,autocomplete,jtextfield,java
来源: https://codeday.me/bug/20191030/1969115.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有