Java 通过带有JComboBox元素的JButton执行某些操作

Java 通过带有JComboBox元素的JButton执行某些操作,java,swing,jbutton,jcombobox,Java,Swing,Jbutton,Jcombobox,我需要找到连接JComboBox和JButton的解决方案。表示在JComboBox中对所选项目执行“按钮” 我为此创建了一个控制器 公共类DeleteButtonController实现ActionListener{ 私人海景; 专用接口模型; 私人JComboBox列表 public DeleteButtonController(OceanGui view, Ocean model, JComboBox list) { this.view = view; this.model

我需要找到连接
JComboBox
JButton
的解决方案。表示在
JComboBox
中对所选项目执行“按钮”

我为此创建了一个控制器

公共类DeleteButtonController实现ActionListener{ 私人海景; 专用接口模型; 私人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位于 infpp.oceanlife.controller.DeleteButtonController.actionPerformed(DeleteButtonController.java:25) 在 javax.swing.AbstractButton.fireActionPerformed(未知 来源)在 javax.swing.AbstractButton$Handler.actionPerformed(未知 来源)在 javax.swing.DefaultButtonModel.fireActionPerformed(未知 来源)在 javax.swing.DefaultButtonModel.setPressed(未知 来源)在 javax.swing.plaf.basic.BasicButtoListener.mouseReleased(未知 来源)在 java.awt.Component.ProcessMouseeEvent(未知 来源)在 javax.swing.JComponent.ProcessMouseeEvent(未知 来源)在 java.awt.Component.processEvent(未知 来源)在 java.awt.Container.processEvent(未知 来源)在 java.awt.Component.dispatchEventImpl(未知 来源)在 java.awt.Container.dispatchEventImpl(未知 来源)在 java.awt.Component.dispatchEvent(未知 来源)在 java.awt.LightweightDispatcher.RetargetMouseeEvent(未知 来源)在 java.awt.LightweightDispatcher.ProcessMouseeEvent(未知 来源)在 java.awt.LightweightDispatcher.dispatchEvent(未知 来源)在 java.awt.Container.dispatchEventImpl(未知 来源)在 java.awt.Window.dispatchEventImpl(未知 来源)在 java.awt.Component.dispatchEvent(未知 来源)在 java.awt.EventQueue.dispatchEvent(未知 来源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知) 来源)在 java.awt.EventDispatchThread.pumpEventsForFilter(未知 来源)在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知) 来源)在 java.awt.EventDispatchThread.pumpEvents(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知 来源)在 java.awt.EventDispatchThread.run(未知 (来源)

第25行写着

    OceanObject obj = (OceanObject) list.getSelectedItem();
“用JButton.do按钮连接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
s。因此,这个问题回到了代码中向组合框添加内容的地方。这看起来像什么?

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

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

您必须用字符串填充
JComboBox
的模型。要么用
OceanObject
s填充它们,然后你的角色转换就可以了,要么从JComboBox中取出字符串对象,以某种方式取回你的
OceanObject

    Vector<OceanItem> oceanItems = new Vector<OceanItem>();
    oceanItems.add(new OceanItem(...));
    oceanItems.add(new OceanItem(...));
    oceanItems.add(new OceanItem(...));
    JComboBox box = new JComboBox(oceanItems);
Vector-items=new-Vector();
添加(新的oceanItems(…);
添加(新的oceanItems(…);
添加(新的oceanItems(…);
JComboBox=新的JComboBox(项目);

谢谢大家的帮助。 我只是用我的新技术建立了一个解决方案。我希望其他人能帮上忙

   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);
        }

    }
}
公共类DeleteButtonController实现ActionListener{
私人海景;
公共DeleteButtonController(OceanGui视图){
this.view=视图;
}
@凌驾
已执行的公共无效操作(操作事件arg0){
试一试{
OceanObject obj=(OceanObject)view.getObjects().getSelectedItem();
int index=view.getModel().getIndexOfClosestOceanObject(
obj.getPosition()[0],obj.getPosition()[1]);
view.getModel().delOceanObject(索引);
view.getObjects().removeAllItems();
迭代器迭代器=view.getModel().getOceanObjects()
.iterator();
while(iterator.hasNext()){
view.getObjects().addItem(iterator.next());
}