组合框和 MVC 模式的问题

Trouble with Combobox and MVC pattern

我遇到了一个关于 JComboBox 和 MCV 模式的小问题。

在我的 View 包中,我有一个 class gui。这包含组合框。

    package view;
    public class Gui {
    .........
    public JComboBox<OceanObject> oceanBoxDelete = new ComboBox<OceanObject> 
    ();
    this.down.add(this.oceanBoxDelete);

    this.oceanBoxDelete.setSize(40, 1);
    .......

这也包含一个按钮。如果按钮被击中,它会通过按钮 listener/action 侦听器触发开关。 这个开关应该触发一个从列表中删除一个对象的过程。 如果我将动作侦听器放入同一个 java 文件中,它可以工作,但我不允许这样做。如果我将它放入按钮侦听器文件中,当我进入带有注释未知来源和 .

的组合框时,我会得到一个空指针异常

我的按钮监听器看起来像:

    package control;
    import view.Gui;

    public class ButtonListener implements ActionListener{

    private Gui gui;

    public ButtonListener() {
    this.ocean = ocean;
    }

   @Override
   public void actionPerformed(ActionEvent ae) {

    switch (ae.getActionCommand()) {
    ....
    case "Delete":
        System.out.println("deleteButton wurde gedrueckt.");

        OceanObject oObject = (OceanObject)   
        gui.oceanBoxDelete.getSelectedItem());
        go.removeOceanOjectFromOcean(oObject);
    .......

我可以看到触发了正确的开关,因为 println 显示在控制台中。

所以我认为问题是 getSelectedItem 看不到组合框,我需要让它知道它,但是如何?

ButtonListener class 中,您没有在构造函数中初始化 gui。除非您通过未列出的其他方法传递它,否则当您在 actionPerformed().

中访问它时,它是 null

您可以将 guiButtonListener 需要的任何其他内容传递给构造函数:

public ButtonListener(Gui gui, Ocean ocean, Go go) {
    this.gui = gui;
    this.ocean = ocean;
    this.go = go;
}

那么当你在Guiclass中创建ButtonListener时,你需要提供实际值:

this.deleteButton.addActionListener(new ButtonListener(
        this,
        this.oceanPanel.getOcean(),
        this.go
));

我猜 oceanPanel.getOcean() 提供了 Ocean 实例 - 如果没有,请根据需要进行更改。