通过带有JComboBox元素的JButton做一些事情

时间:2011-06-27 21:39:24

标签: java swing jbutton jcombobox

我需要找到将JComboBoxJButton相关联的解决方案。对JComboBox中选定的项目进行“按钮”操作。

我为那个

创建了一个Controller

公共类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无法强制转换为   infpp.oceanlife.model.OceanObject at   infpp.oceanlife.controller.DeleteButtonController.actionPerformed(DeleteButtonController.java:25)     在   javax.swing.AbstractButton.fireActionPerformed(未知   来源)at   javax.swing.AbstractButton中的$ Handler.actionPerformed(未知   来源)at   javax.swing.DefaultButtonModel.fireActionPerformed(未知   来源)at   javax.swing.DefaultButtonModel.setPressed(未知   来源)at   javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知   来源)at   java.awt.Component.processMouseEvent(未知   来源)at   javax.swing.JComponent.processMouseEvent(未知   来源)at   java.awt.Component.processEvent(未知   来源)at   java.awt.Container.processEvent(未知   来源)at   java.awt.Component.dispatchEventImpl(未知   来源)at   java.awt.Container.dispatchEventImpl(未知   来源)at   java.awt.Component.dispatchEvent(未知   来源)at   java.awt.LightweightDispatcher.retargetMouseEvent(未知   来源)at   java.awt.LightweightDispatcher.processMouseEvent(未知   来源)at   java.awt.LightweightDispatcher.dispatchEvent(未知   来源)at   java.awt.Container.dispatchEventImpl(未知   来源)at   java.awt.Window.dispatchEventImpl(未知   来源)at   java.awt.Component.dispatchEvent(未知   来源)at   java.awt.EventQueue.dispatchEvent(未知   来源)at   java.awt.EventDispatchThread.pumpOneEventForFilters(未知   来源)at   java.awt.EventDispatchThread.pumpEventsForFilter(未知   来源)at   java.awt.EventDispatchThread.pumpEventsForHierarchy(未知   来源)at   java.awt.EventDispatchThread.pumpEvents(未知   来源)at   java.awt.EventDispatchThread.pumpEvents(未知   来源)at   java.awt.EventDispatchThread.run(未知   源)

在第25行,它说

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

4 个答案:

答案 0 :(得分:1)

“将JComboBox与JButton连接。使用所选项目执行按钮”是什么意思?你的意思是你希望用户能够在组合框中选择一个项目,然后按下按钮,并询问如何对组合框中的选定项目执行某些操作?

如果是,只需通过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添加到ComboBox,您将添加String,因此会抛出异常。所以这个问题可以追溯到代码中你向ComboBox添加内容的地方。那是什么样的?

答案 1 :(得分:1)

为模型提供一个公共方法deleteSelectedItem(),并让按钮的ActionListener调用该方法。按钮/动作侦听器不需要知道项目的删除方式;它需要知道和做的就是向模型发送消息来执行此操作。

答案 2 :(得分:1)

第25行,异常会告诉您需要知道的一切。您正在从JComboBox中抽取项目并转换为OceanObject,但异常会告诉您它们是String

您必须使用字符串填充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);

答案 3 :(得分: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);
        }

    }
}