Сделайте что-нибудь через JButton с элементом JComboBox - PullRequest
1 голос
/ 28 июня 2011

Мне нужно найти разрешение для соединения JComboBox с JButton. Значит сделать "кнопку" с выбранным элементом в JComboBox.

Я создал контроллер для этого

открытый класс 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);
}

}

В моем графическом интерфейсе я сделал это:

    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. infpp.oceanlife.model.OceanObject at 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.BasicButtonListener.mouseReleased (Неизвестно Источник) в java.awt.Component.processMouseEvent (Неизвестно Источник) в javax.swing.JComponent.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 (Неизвестно Источник) в java.awt.LightweightDispatcher.processMouseEvent (Неизвестно Источник) в 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();

Ответы [ 4 ]

1 голос
/ 28 июня 2011

Дайте модели открытый метод deleteSelectedItem() и вызовите для ActionListener кнопки этот метод. Слушателю кнопки / действия не нужно знать, как элемент удаляется; все, что нужно знать и делать, - это отправить сообщение модели, чтобы сделать это.

1 голос
/ 28 июня 2011

Строка 25 и исключение говорит вам все, что вам нужно знать.Вы вытаскиваете предметы из JComboBox и приводите их к OceanObject, но исключение говорит вам, что они String s.

Вы должны заполнить модель вашего JComboBox строками.Либо заполните их OceanObject с, и тогда ваш каст будет работать, либо вытащите объект String из 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);
1 голос
/ 28 июня 2011

Что вы подразумеваете под «соединением JComboBox с JButton. Кнопка do с выбранным элементом»?Вы хотите сказать, что хотите, чтобы пользователь мог выбрать элемент в поле со списком, затем нажать кнопку, и вы спрашиваете, как выполнить какое-либо действие с выбранным элементом в поле со списком?

Еслида, просто добавьте ActionListener к кнопке через addActionListener (), и в этом слушателе действия получите выбранный элемент.

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 в ComboBox, вы добавляете String s.Таким образом, эта проблема восходит к тому месту в вашем коде, куда вы добавляете вещи в свой ComboBox.Как это выглядит?

0 голосов
/ 28 июня 2011

Спасибо за вашу помощь всем. Я просто строю решение с моим новым ноу-хау. Я надеюсь, что кто-то еще найдет помощь с этим.

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

    }
}
...