2011-06-27 71 views
1

我需要找到連接JComboBoxJButton的分辨率。意思就是用JComboBox中的選定項目做「按鈕」。通過JComboBox的元素通過JButton執行某些操作

我創建爲

公共類DeleteButtonController一個控制器實現的ActionListener { 私人OceanGui視圖; 私有OceanInterface模型; 私人JComboBox列表;

public DeleteButtonController(OceanGui view, Ocean model, JComboBox list) { 
    this.view = view; 
    this.model = model; 
    this.list = list; 
} 
@Override 
public void actionPerformed(ActionEvent arg0) { 
    OceanObject obj = (OceanObject) list.getSelectedItem(); 
    int index = model.getIndexOfClosestOceanObject(obj.getPosition()[0], obj.getPosition()[1]); 
    model.delOceanObject(index); 
} 

}

在我的GUI我這樣做:

this.buttonArray[1] = new JButton(this.buttonCaptions[1]); 
    this.buttonArray[1].addActionListener(new DeleteButtonController(this, model, objects)); 
    panel.add(this.buttonArray[1]); 

我掙例外是:

異常在線程 「AWT-EventQueue的-0」 java.lang.ClassCastException: java.lang.String不能轉換爲 fpp.oceanlife.model.OceanObject在 infpp.oceanlife.controller.DeleteButtonController.actionPerformed(DeleteButtonController.java:25) 在 javax.swing.AbstractButton.fireActionPerformed(未知 來源)在 javax.swing.AbstractButton中的$處理器。在在 javax.swing.DefaultButtonModel.setPressed(未知 源) javax.swing.DefaultButtonModel.fireActionPerformed(未知 源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased的actionPerformed(未知 源)(未知 源)在 java.awt.Component.processMouseEvent(未知 源)在 javax.swing.JComponent.processMouseEvent(未知 源)處 java.awt.Container.processEvent(未知 源) java.awt.Component.processEvent(未知 源)在 java.awt.Component.dispatchEventImpl (未知 源)處 java.awt.LightweightDispatcher.retargetMouseEvent(未知 源) java.awt.Container.dispatchEventImpl(未知 源)在 java.awt.Component.dispatchEvent(未知 源)在 的java .awt.LightweightDispatcher.processMouseEvent(Unknown Source)at java.awt .LightweightDispatcher.dispatchEvent(未知 源)處 java.awt.Window.dispatchEventImpl(未知 源) java.awt.Container.dispatchEventImpl(未知 源)在 java.awt.Component.dispatchEvent(未知 源)在在 java.awt.EventDispatchThread java.awt.EventQueue.dispatchEvent(未知 源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知 源)在 java.awt.EventDispatchThread.pumpEventsForFilter(未知 源) .pumpEventsForHierarchy(Unknown Source)at java.awt .EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread。pumpEvents(未知 來源)在 java.awt.EventDispatchThread.run(未知 來源)

在第25行,它說

OceanObject obj = (OceanObject) list.getSelectedItem(); 

回答

1

你說的意思是「用一個JButton連接的JComboBox 。按鈕與選定的項目「?您的意思是您希望用戶能夠在組合框中選擇一個項目,然後按下按鈕,並且您要求如何對組合框中的選定項目執行某些操作?

如果是,只需通過addActionListener()將ActionListener添加到按鈕中,然後在該操作偵聽器中獲取所選的項目。

comboBox = new JComboBox(); 
container.add(comboBox); 
button = new JButton("Button"); 
container.add(button); 
button.addActionListener(myButtonListener); 

... 

myButtonListener = new ActionListener() 
{ 
    public void actionPerformed(ActionEvent ae) 
    { 
     System.out.println("Selected item is: " + comboBox.getSelectedItem()); 
     OceanObject myObject = (OceanObject)comboBox.getSelectedItem(); 
     // do something else with myObject here 
    } 
}; 

如果我明白你問的是什麼,我認爲這正是你想要的。根據你所說的話,這聽起來不像你需要搗亂你進入那裏的任何其他東西。它就像製作和添加組合框和按鈕一樣簡單,並將動作偵聽器添加到按鈕中,該按鈕在其actionPerformed()組合框中執行某些操作。

好吧,根據你的評論我想我現在看到你的問題在哪裏。儘管如此,我堅持認爲你不需要額外的開銷。 JComboBox有一個getSelectedItem()。我在上面修改了我的代碼,以便在你的邏輯實現的地方,我已經替換了關於「把你的邏輯放在這裏」的評論,並在那裏放置了一個輸出,以便你可以看到這個用法。

正如您所看到的,我甚至不必跟蹤所做的更改。

(編輯) 在回答您的編輯問題:異常被拋出,因爲你不加入OceanObject s到組合框,您要添加String秒。所以這個問題可以追溯到您的代碼中將您添加到ComboBox的地方。這是什麼樣子?

1

給模型一個公共方法deleteSelectedItem()並讓按鈕的ActionListener調用該方法。按鈕/動作偵聽器不需要知道該項目是如何刪除的;所有它需要知道和做的就是向模型發送消息來做到這一點。

1

第25行和異常告訴你你需要知道的一切。您正在從JComboBox中拉出物品並投射到OceanObject,但例外情況會告訴您它們是String s。

您必須使用字符串填充JComboBox的模型。您可以使用OceanObject填充它們,然後您的演員將工作,或從JComboBox中拔出String對象,並以某種方式取回您的OceanObject

Vector<OceanItem> oceanItems = new Vector<OceanItem>(); 
    oceanItems.add(new OceanItem(...)); 
    oceanItems.add(new OceanItem(...)); 
    oceanItems.add(new OceanItem(...)); 
    JComboBox box = new JComboBox(oceanItems); 
0

感謝您的幫助。 我只是用我的新知識來建立解決方案。我希望別人會找到一些幫助。

public class DeleteButtonController implements ActionListener { 
    private OceanGui view; 

    public DeleteButtonController(OceanGui view) { 
     this.view = view; 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     try { 
      OceanObject obj = (OceanObject) view.getObjects().getSelectedItem(); 
      int index = view.getModel().getIndexOfClosestOceanObject(
        obj.getPosition()[0], obj.getPosition()[1]); 
      view.getModel().delOceanObject(index); 

      view.getObjects().removeAllItems(); 
      Iterator<OceanObject> iterator = view.getModel().getOceanObjects() 
        .iterator(); 
      while (iterator.hasNext()) { 
       view.getObjects().addItem(iterator.next()); 
      } 

     } catch (NullPointerException e) { 
      JOptionPane.showMessageDialog(null, "No more OceanObjects in Ocean.", "Error", JOptionPane.ERROR_MESSAGE); 
     } 

    } 
}