Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java can';t从jcombobox中删除第一个元素_Java_Swing_Jcombobox - Fatal编程技术网

Java can';t从jcombobox中删除第一个元素

Java can';t从jcombobox中删除第一个元素,java,swing,jcombobox,Java,Swing,Jcombobox,我无法从jcombobox中删除第一个元素。我的代码如下: JComboBox cBox= cBox= new JComboBox(); ... while (cBox.getItemCount() > 0) cBox.removeItemAt(0); 对于测试运行,我在cBox中有3项。当它到达removeItemAt(0)时,调试会陷入混乱,进入一些绝对不相关的文件访问代码。这样做两次,就会得到下面的异常。我尝试了removeAllItems(),它直接得到了相同的异常。

我无法从jcombobox中删除第一个元素。我的代码如下:

JComboBox cBox= cBox= new JComboBox();
...    
while (cBox.getItemCount() > 0)
  cBox.removeItemAt(0);
对于测试运行,我在cBox中有3项。当它到达removeItemAt(0)时,调试会陷入混乱,进入一些绝对不相关的文件访问代码。这样做两次,就会得到下面的异常。我尝试了removeAllItems(),它直接得到了相同的异常。但是,removeItem(1)可以正常工作,直到只剩下1个元素。该异常不会使应用程序崩溃,之后我在组合框中看不到任何项目,因此它起了一点作用。我到底做错了什么

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at util.Gui$4.actionPerformed(Gui.java:111)
at javax.swing.JComboBox.fireActionEvent(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.DefaultComboBoxModel.removeElementAt(Unknown Source)
at javax.swing.JComboBox.removeItemAt(Unknown Source)
at util.Gui.prepareSubLists(Gui.java:164)
at util.Gui$3.actionPerformed(Gui.java:97)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.setSelectedItem(Unknown Source)
at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(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.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(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.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(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)

你的条件陈述不对吗?将
while
替换为
if
,如下所示

if(cBox.getItemCount() > 0){
  cBox.removeItemAt(0);
}

这是一个:


运行此操作时,按
JButton
将删除
JComboBox
中的第一项。您可以一直按此键,直到其为空。

此异常可能发生,因为删除组合项时会触发事件,并且在此事件处理方法中,您仍然引用组合框项

例如,当您在代码中的某个位置(actionPeformed()中除外)删除combo.removeItemAt(0)或removeAllItems()组合框中的最后一项时,actionPerformed事件仍将被触发/执行。但actionPerformed()方法通常包含对用户操作作出反应的代码(用户在组合框的某个位置单击)。因此,当最后一个项目被删除时,组合框中不再有其他项目,actionPerformed()中对项目或索引的任何引用都将导致异常


解决方案是将代码从actionPerformed移动到mouseClicked()或其他事件处理程序,具体取决于您要执行的操作。

如果您将实际代码放在此处,这将非常有用。它可能是如mre所说的while状态,或者任何其他导致NPE的问题!问题在于您没有显示的代码,请参阅stacktrace的第一行:
位于util.Gui$4.actionPerformed(Gui.java:111)
我必须添加一个空白项,然后删除其余项。它似乎无法从组合框项目中删除所有项目。再说一次:最有可能的问题不是删除项目(不管它们是什么,默认组合都经过了足够好的测试-被大量开发人员使用了15年以上,我们同意吗?)。相反,Gui.java的第111行出现了问题。不要添加随机攻击,深入挖掘并理解原因…removeItemAt(0)也会触发事件actionPerformed(),有时用户会将代码放在此处,这是指不幸在几毫秒前被删除的项目。请参阅下面更详细的anser@kleopatracan在while中没有发现任何错误-逻辑与if相同,只是重复了一遍。我错过了什么?@kleopatra,你说得对。看起来OP实际上是在执行“全部删除”。但这仍然意味着逻辑是错误的。问题肯定在别处。如果OP没有更新我们,我会删除这个答案。好吧,你的解决方案是有效的,我在实际代码中做了一些单独的部分,但似乎也失败了。应用程序只接受我添加一个空格,然后删除其余的。我也尝试了MutableComboxModel,但如果所有内容都被删除,结果是一样的。我将删除所有,然后一点一点地添加,以查看它在哪里爆炸:)。感谢Public void PreparesPublists()抛出FileNotFoundException{Subcategory List.clear();Subcategory List=fileHandler.getSubCategory(kategori.getSelectedItem().toString());//测试的东西MutableComboxModel mcbm=(MutableComboxModel)cBox.getModel();int initialSize=cBox.getItemCount();int breaker=0;cBox.addItem(“”);//必须添加while(cBox.getItemCount()>0){Object item=cBox.getItemAt(0);mcbm.removeElement(item);++breaker;if(breaker>=initialSize)break;}if(subcategory list!=null)for(int i=0;这很有效。很抱歉,我有8个小时没有回复。不,这在行为良好的代码中不会发生;-)要使其表现良好,只需始终检查您要处理的项是否仍在模型中-在任何方法中(包括actionPerformed)
public final class JComboBoxDemo {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    public static void createAndShowGUI(){
        final JFrame frame = new JFrame("JComboBox Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(JComboPane.newInstance());
        frame.setSize(new Dimension(250, 100)); // for demonstration purposes only
        //frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class JComboPane extends JPanel{
        private JComboPane(){
            super();
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            JCenteredComboBox comboBox = JCenteredComboBox.newInstance();
            JCenteredButton button = JCenteredButton.newInstance(comboBox);
            add(comboBox);
            add(button);
        }

        public static final JComboPane newInstance(){
            return new JComboPane();
        }

        private static final class JCenteredComboBox extends JComboBox{
            private JCenteredComboBox(){
                super(new String[]{"Item 1", "Item 2", "Item 3"});
                setAlignmentX(Component.CENTER_ALIGNMENT);
            }

            public static final JCenteredComboBox newInstance(){
                return new JCenteredComboBox();
            }
        }

        private static final class JCenteredButton extends JButton{
            private JCenteredButton(final JComboBox comboBox){
                super("Remove First Item");
                setAlignmentX(Component.CENTER_ALIGNMENT);
                addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(comboBox.getItemCount() > 0){
                            comboBox.removeItemAt(0); // your logic
                        }
                    }
                });
            }

            public static final JCenteredButton newInstance(final JComboBox comboBox){
                return new JCenteredButton(comboBox);
            }
        }
    }
}