2011-06-27 74 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); 
     } 

    } 
}