我需要找到将JComboBox
与JButton
相关联的解决方案。对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();
答案 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);
}
}
}