2013-04-17 35 views
0

我試圖理解爲什麼下面的代碼不工作:爲什麼建築時JComboBox需要物品-1?

  JComboBox status = new javax.swing.JComboBox(); 
      status.setModel(new DefaultComboBoxModel() { 
      @Override 
      public void addElement(Object anObject) { 
       statusList.add((RequirementStatus) anObject); 
       super.addElement(anObject); 
      } 

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

      @Override 
      public Object getElementAt(int index) { 
       return index >= 0 && index < statusList.size() 
         ? statusList.get(index) : null; 
      } 
     }); 
     status.setRenderer(new ListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, 
        Object value, int index, boolean isSelected, 
        boolean cellHasFocus) { 

       return index >= 0 ? new JLabel(
         ((RequirementStatus) ((ComboBoxModel) status.getModel()) 
         .getElementAt(index)).getStatus()) 
         : new JLabel(""); 
      } 
     }); 

這一個作用:

  JComboBox status = new javax.swing.JComboBox(); 
      status.setModel(new DefaultComboBoxModel() { 
      @Override 
      public void addElement(Object anObject) { 
       statusList.add((RequirementStatus) anObject); 
       super.addElement(anObject); 
      } 

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

      @Override 
      public Object getElementAt(int index) { 
       return statusList.get(index); 
      } 
     }); 
     status.setRenderer(new ListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, 
        Object value, int index, boolean isSelected, 
        boolean cellHasFocus) { 

       return index >= 0 ? new JLabel(
         ((RequirementStatus) ((ComboBoxModel) status.getModel()) 
         .getElementAt(index)).getStatus()) 
         : new JLabel("-none-"); 
      } 
     }); 

我不得不說條件添加到代碼,因爲某種原因而構建GUI代碼請求在位置-1處呈現元素。如果我不返回帶有文本的標籤,則組合框完全不顯示。

編輯:

這是我的錯誤,如果這個解決方法是不存在的:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.get(ArrayList.java:324) 
    at net.sourceforge.javydreamercsw.client.ui.nodes.actions.EditRequirementDialog$5.getElementAt(EditRequirementDialog.java:119) 
    at net.sourceforge.javydreamercsw.client.ui.nodes.actions.EditRequirementDialog$6.getListCellRendererComponent(EditRequirementDialog.java:127) 
    at javax.swing.plaf.basic.BasicComboBoxUI.getDisplaySize(BasicComboBoxUI.java:1334) 
    at javax.swing.plaf.basic.BasicComboBoxUI.getMinimumSize(BasicComboBoxUI.java:903) 
    at javax.swing.plaf.basic.BasicComboBoxUI.getPreferredSize(BasicComboBoxUI.java:892) 
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1642) 
    at javax.swing.GroupLayout$ComponentSpring.calculateNonlinkedPreferredSize(GroupLayout.java:2944) 
    at javax.swing.GroupLayout$ComponentSpring.calculatePreferredSize(GroupLayout.java:2905) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1593) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1593) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1593) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1590) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1588) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1604) 
    at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1588) 
    at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1568) 
    at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1325) 
    at javax.swing.GroupLayout$SequentialGroup.setValidSize(GroupLayout.java:1972) 
    at javax.swing.GroupLayout$Group.setSize(GroupLayout.java:1553) 
    at javax.swing.GroupLayout.calculateAutopadding(GroupLayout.java:1058) 
    at javax.swing.GroupLayout.layoutContainer(GroupLayout.java:897) 
    at java.awt.Container.layout(Container.java:1419) 
    at java.awt.Container.doLayout(Container.java:1408) 
    at java.awt.Container.validateTree(Container.java:1505) 
    at java.awt.Container.validateTree(Container.java:1511) 
    at java.awt.Container.validateTree(Container.java:1511) 
    at java.awt.Container.validateTree(Container.java:1511) 
    at java.awt.Container.validate(Container.java:1478) 
    at java.awt.Dialog.conditionalShow(Dialog.java:890) 
    at java.awt.Dialog.show(Dialog.java:1036) 
    at java.awt.Component.show(Component.java:1591) 
    at java.awt.Component.setVisible(Component.java:1543) 
    at java.awt.Window.setVisible(Window.java:843) 
    at java.awt.Dialog.setVisible(Dialog.java:987) 
    at net.sourceforge.javydreamercsw.client.ui.nodes.actions.EditRequirementAction$1.run(EditRequirementAction.java:33) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:666) 
    at java.awt.EventQueue.access$400(EventQueue.java:81) 
    at java.awt.EventQueue$2.run(EventQueue.java:627) 
    at java.awt.EventQueue$2.run(EventQueue.java:625) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:636) 
    at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
[catch] at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

我知道這應該是一件容易的事情,就像一個標誌設置,但我可以」找到它。

任何想法?

解決方案: 取下模型倍率和改變渲染器代碼如下:

status.setRenderer(new ListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, 
        Object value, int index, boolean isSelected, 
        boolean cellHasFocus) { 
       return index >= 0 ? new JLabel(
         ((RequirementStatus) value).getStatus()) 
         : new JLabel(((RequirementStatus) list.getSelectedValue()).getStatus()); 
      } 
     }); 
+0

爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+2

您知道'((ComboBoxModel)status.getModel()) .getElementAt(index))'嚴格等於提供的參數'value'嗎?無論如何,如果第一次顯示時,當前選中的對象是'null','null'不是你模型的一部分,UI沒有其他選擇,只能提供-1作爲索引 –

+2

爲什麼你重寫模型?我認爲沒有理由這樣做。如果要在模型中存儲自定義對象,則只需提供自定義渲染器即可顯示對象中的數據。 – camickr

回答

1

從JComboBox中#setRenderer的Javadoc:

要顯示所選擇的項目,aRenderer.getListCellRendererComponent是調用,傳遞列表對象和索引-1。

+0

這似乎解釋了主要問題。 – javydreamercsw

+0

刪除模型重寫和更改呈現器的技巧。查看編輯代碼的問題。 – javydreamercsw

+0

請注意,該值已經是選定的值,因此不需要再從列表中獲取。您的渲染器也不繪製選定/對焦狀態。最好擴展DefaultListCellRenderer並將value.getStatus()傳遞給super.getListCellRendererComponent() –