首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过带有JButton元素的JComboBox做某事

通过带有JButton元素的JComboBox做某事
EN

Stack Overflow用户
提问于 2011-06-27 21:39:24
回答 4查看 2.2K关注 0票数 1

我需要找到连接JComboBoxJButton的解决方案。意思是在JComboBox中对选定的项执行"Button“。

我为此创建了一个控制器

公共类DeleteButtonController实现ActionListener{私有OceanGui视图;私有OceanInterface模型;私有JComboBox列表;

代码语言:javascript
复制
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中,我这样做了:

代码语言:javascript
复制
    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“中的infpp.oceanlife.controller.DeleteButtonController.actionPerformed(DeleteButtonController.java:25)异常(java.lang.ClassCastException):不能将java.lang.String转换为infpp.oceanlife.model.OceanObject (在javax.swing.AbstractButton.fireActionPerformed(Unknown Source)、在javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source(在javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)、在javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) (在javax.swing.DefaultButtonModel.setPressed(Unknown Source)javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown源),java.awt.Component.processMouseEvent(未知源),java.awt.Component.processEvent(未知源),java.awt.Container.processEvent(未知源),java.awt.Component.dispatchEventImpl(未知源),java.awt.Container.dispatchEventImpl(未知源),java.awt.Component.dispatchEvent(未知源)(来源)在java.awt.LightweightDispatcher.retargetMouseEvent(Unknown )在java.awt.LightweightDispatcher.processMouseEvent(Unknown来源)在java.awt.LightweightDispatcher.dispatchEvent(Unknown来源)在java.awt.Container.dispatchEventImpl(未知来源)在java.awt.Window.dispatchEventImpl(未知来源)在java.awt.Component.dispatchEvent(未知来源)在java.awt.EventQueue.dispatchEvent(未知来源)在java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown(来源)在java.awt.EventDispatchThread.pumpEventsForFilter(Unknown来源)在java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown来源)在java.awt.EventDispatchThread.pumpEvents(Unknown来源)在java.awt.EventDispatchThread.pumpEvents(Unknown来源)在java.awt.EventDispatchThread.run(未知来源)

在第25行上面写着

代码语言:javascript
复制
    OceanObject obj = (OceanObject) list.getSelectedItem();
EN

回答 4

Stack Overflow用户

发布于 2011-06-27 21:51:34

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

如果是,只需通过ActionListener ()向按钮添加一个addActionListener,在该操作中,侦听器获取所选的项。

代码语言:javascript
复制
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()。我修改了上面的代码,以便在您的逻辑所在的地方,我已经替换了关于“将逻辑放在这里”的注释,并将输出放在这里,这样您就可以看到它的使用了。

正如您所看到的,我甚至不需要跟踪更改时所选择的内容。

(编辑)在回答您编辑的问题时:抛出异常是因为您是而不是向ComboBox添加OceanObjects,而是添加Strings。因此,这个问题回到代码中要向ComboBox添加内容的位置。那是什么样子的?

票数 1
EN

Stack Overflow用户

发布于 2011-06-27 22:09:03

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

票数 1
EN

Stack Overflow用户

发布于 2011-06-27 22:46:09

第25行和异常告诉您您需要知道的一切。您正在将项目从JComboBox中取出并转换为OceanObject,但例外情况表明它们是String的。

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

代码语言:javascript
复制
    Vector<OceanItem> oceanItems = new Vector<OceanItem>();
    oceanItems.add(new OceanItem(...));
    oceanItems.add(new OceanItem(...));
    oceanItems.add(new OceanItem(...));
    JComboBox box = new JComboBox(oceanItems);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6499256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档