带按钮的适配器模式,适配器 class 必须知道按下了哪个按钮

Adapter pattern with Buttons, adaptor class has to know which button was pressed

这是一个在 Swing 面板中执行的 actionPerformed,带有来自框架的自定义按钮,该框架打乱了它们的 classes,因此所有方法都是 a():String 或 b():void 并且无法制作弄清楚它到底是什么。

我遇到了一个编译器错误,因为当我继承这个按钮时 class 编译器发现 a():void 一个 a():String 在 Java 中是不允许的。我的解决方案是使用这样的适配器模式:

public abstract class FactoryButton {
    private CustomButton button;

    public FactoryButton(int width, int height) {
        button = new DynButton();
        button.setSize(width, height);
    }
    public DynButton getButton() {
        return button;
    }
}

所以我的 FactoryButton 将 CustomButton class 作为私有成员。 FactoryButton 是另一个名为 FactorySelectionButton 的按钮 class 的父级 在我以前能够获取事件源的地方执行了一个操作:

@Override
public void actionPerformed(ActionEvent arg0) {
    if (arg0.getSource() instanceof FactorySelectionButton) {
        // User selected a factory
        selectedItem = ((FactorySelectionButton) arg0.getSource()).getFactory();
        // Close the screen, so control returns back to the parent window
        cancel();
    } else {
        // other buttons implementation
    }
}

但是现在因为我解决了适配器模式的一个问题我有另一个 arg0.getSource() 不再给我 FactorySelectionButton 但它现在给了一个 CustomButton 这让我无法知道哪个自定义按钮是按下。

不放弃自定义按钮的原因是我绑定到框架,我必须使用它并且工厂的数量会增长所以我不想要硬编码按钮。

有人知道我该如何解决这个问题吗?

我通过遍历我的所有组件并检查它们是否有我需要的按钮并仔细检查它是否真的是我想要的 class 的实例找到了解决方法。

@Override
public void actionPerformed(ActionEvent arg0) {
    for (FactoryButton component : components) {
        if(component.getButton().equals(arg0.getSource()) && component instanceof FactorySelectionButton)
             selectedItem = ((FactorySelectionButton) component).getFactory();
        return;
    }
    //other buttons implementation
}