【问题标题】:JAVA Class not working properlyJAVA 类无法正常工作
【发布时间】:2015-08-26 06:11:24
【问题描述】:

我有一个加载/重新加载 JComboBox 的方法,我正在使用一个名为 hiddenItem 的类将隐藏值附加到显示值。起初加载 JComboBox 工作良好,但在 Box 重新加载后我收到错误,JComboBox 中的值不是 hiddenItem,那么为什么重新加载后不添加 hiddenItem?也许我需要以某种方式重置或清理 hiddenItem 类?谢谢!

hiddenItem.java:

public class hiddenItem {

    String displayValue;
    Integer hiddenValue;

    //Constructor
    public hiddenItem(String d, Integer h) {
        displayValue = d;
        hiddenValue = h;
    }

    //Accessor
    public Integer get_value() {
        return hiddenValue;
    }

    //Override ToString method
    @Override
    public String toString() {
        return displayValue;
    }
}

加载/重新加载方法:

public static void fill_combos() throws SQLException, ParserConfigurationException, XPathExpressionException, SAXException, IOException, PropertyVetoException {
    Darbai.onload = true;
    ResultSet rs = null;

    darb_combo.removeAllItems();
    ats_combo.removeAllItems();
    darb_combo.addItem(new hiddenItem("ALL", -1));
    ats_combo.addItem(new hiddenItem("ALL", -1));
    rs = select_data(GET_DARBUOTOJAI, null);
    while (rs.next()) {
        darb_combo.addItem(new hiddenItem(rs.getString("name") + " " + rs.getString("surname"), rs.getInt("id")));
        ats_combo.addItem(new hiddenItem(rs.getString("name") + " " + rs.getString("surname"), rs.getInt("id")));
    }
    rs.close();
    darb_combo.setSelectedIndex(0);
    ats_combo.setSelectedIndex(0);

    klientas_combo.removeAllItems();
    klientas_combo.addItem(new hiddenItem("ALL", -1));
    rs = select_data(GET_KLIENTAI, null);
    while (rs.next()) {
        klientas_combo.addItem(new hiddenItem(rs.getString("customer"), rs.getInt("id")));
    }
    rs.close();
    klientas_combo.setSelectedIndex(0);

    busena_combo.removeAllItems();
    busena_combo.addItem(new hiddenItem("ALL", -1));
    busena_combo.addItem(new hiddenItem("Reikia atlikti", 0));
    busena_combo.addItem(new hiddenItem("Skubus", 1));
    busena_combo.addItem(new hiddenItem("Vykdoma", 2));
    busena_combo.addItem(new hiddenItem("Atlikta", 3));
    busena_combo.addItem(new hiddenItem("Užaktuota", 4));
    busena_combo.addItem(new hiddenItem("Garantinis", 5));
    busena_combo.addItem(new hiddenItem("Objektinis", 6));

    AutoCompleteDecorator.decorate(darb_combo);
    AutoCompleteDecorator.decorate(ats_combo);
    AutoCompleteDecorator.decorate(klientas_combo);
    Darbai.onload = false;
}

这是我获得隐藏价值的方法:

if (!Darbai.onload) {
    if (e.getStateChange() == ItemEvent.SELECTED) {
        ResultSet rs = null;
        hiddenItem item = (hiddenItem) e.getItem(); // LINE 805
        Integer id = item.get_value();
        String val = item.displayValue;
     }
}

错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to darbai.hiddenItem
at darbai.pagrindinis.itemStateChanged(pagrindinis.java:805)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1280)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1329)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:576)
at org.jdesktop.swingx.autocomplete.ComboBoxAdaptor.setSelectedItem(ComboBoxAdaptor.java:104)
at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.setSelectedItem(AutoCompleteDocument.java:317)
at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.remove(AutoCompleteDocument.java:243)
at javax.swing.text.JTextComponent.setText(JTextComponent.java:1672)
at javax.swing.plaf.metal.MetalComboBoxEditor$1.setText(MetalComboBoxEditor.java:61)
at javax.swing.plaf.basic.BasicComboBoxEditor.setItem(BasicComboBoxEditor.java:87)
at org.jdesktop.swingx.autocomplete.AutoCompleteComboBoxEditor.setItem(AutoCompleteComboBoxEditor.java:78)
at javax.swing.JComboBox.configureEditor(JComboBox.java:1403)
at javax.swing.plaf.basic.BasicComboBoxUI$Handler.contentsChanged(BasicComboBoxUI.java:1864)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:576)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:834)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:498)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

编辑组合定义(由 NetBeans 自动):

public static javax.swing.JComboBox ats_combo;
public static javax.swing.JComboBox busena_combo;
public static javax.swing.JComboBox darb_combo;
public static javax.swing.JComboBox klientas_combo;

darb_combo = new javax.swing.JComboBox();
ats_combo = new javax.swing.JComboBox();
klientas_combo = new javax.swing.JComboBox();
busena_combo = new javax.swing.JComboBox();

darb_combo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
ats_combo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
klientas_combo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
busena_combo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

【问题讨论】:

  • 看起来 e.getItem(); 返回一个字符串
  • 但是为什么它应该像第一次加载一样返回 hiddenItem
  • 抱歉没能找到你。你把它放到一个隐藏的物品上:(hiddenItem) e.getItem();
  • 您需要重新检查您的代码。毫无疑问,您希望它返回一个 hiddenItem,但无论是语法还是逻辑,您都犯了一个错误。
  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应

标签: java class hidden selecteditem


【解决方案1】:

加载您的代码工作正常,但重新加载组合框有默认值,如您列出的那样是字符串值的数组

新字符串[] {“项目 1”、“项目 2”、“项目 3”、“项目 4”}

所以也加载带有 hiddenItem 对象数组作为默认值的组合框。

您已经指出的错误发生在:

hiddenItem item = (hiddenItem) e.getItem(); // LINE 805

由于 getItem 返回您定义的 String 默认对象。 使用以下代码代替组合的默认值

darb_combo.setModel(new javax.swing.DefaultComboBoxModel(new hiddenItem[] { new hiddenItem("Item 1", 1), new hiddenItem("Item 2", 2), new hiddenItem("Item 3",3), new hiddenItem("Item 4",4 }));

附带说明,因为 hiddenItem 是一个类,请遵循约定并将其重命名为 HiddenItem

【讨论】:

  • 我不明白如何默认加载带有隐藏项的组合框,我收到错误字符串不能转换为隐藏项
猜你喜欢
  • 2017-02-17
  • 2017-03-30
  • 2015-02-20
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2011-08-26
相关资源
最近更新 更多