java - 如果类 B 的实例是类 A 的成员,那么当类 B 中的按钮被按下时,类 B 如何调用类 A 的方法?

标签 java swing

我正在尝试使用 MVC 编码实践制作一个 GUI 来为桌面 RPG 生成角色。我将有几个“控制面板”类,每个类都有一组特定的按钮来处理角色创建过程的不同方面(滚动属性、购买设备等)。我的 Controller 类将拥有每个“控制面板”类的一个实例作为成员。我的通用代码在这里:

公共(public)类 Controller {

private Model m; //class Model not shown
private Viewer v; //class Viewer not shown
private JFrame frame;
private ControlPanelOne cpo;
private ControlPanelTwo cpt; //class ControlPanelTwo not shown

public Controller(){
    m = new Model();
    v = new Viewer();
    frame = new JFrame();
    frame.setLayout(…);
    cpo = new ControlPanelOne();
    cpt = new ControlPanelTwo();
    frame.add(cpo.getPanel());
    frame.add(cpt.getPanel());}

public void update(){
    m.update();
    v.update();}}

公共(public)类ControlPanelOne{

private JPanel panel;
private JButton button;

public ControlPanelOne(){
    panel = new JPanel();
    button = new JButton(“press me”);
    panel.add(button);
    button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            //do some stuff;
            //call Controller’s update method;}})} //the important bit!

public JPanel getPanel(){
    return panel;}}

公共(public)测试员类(class){

public static void main(String[] args){

    Controller c = new Controller();}}

当按下 ControlPanelOne 的按钮时,如何让 ControlPanelOne 查看并调用 Controller 的 update() 方法?

我尝试使 ControlPanelOne 扩展 Controller,以便在按下 ControlPanelOne 的按钮时可以调用 super.update(),但是当实例化 Controller 时(例如在 Tester 类中),其 ControlPanelOne 成员也会实例化,从而两个 Controller ControlPanelOne 的构造函数在构造的无限循环中被调用。

尝试通过将 Controller 的 update() 方法设为静态来欺骗编译器是行不通的,因为实例 m 和 v 不是静态的。

如果可以的话,我不想让 ControlPanelOne 成为 Controller 的内部类。还会有其他“控制面板”类(ControlPanelTwo 等),我担心将它们全部设为内部类会使 Controller 的代码又长又乱。为了整洁起见,我希望每个“控制面板”作为一个单独的类来处理一个特定的功能,并易于维护和模块化代码重用。

很明显,ControlPanelOne 不应该将 Controller 作为成员变量,因为 a)它在概念上是倒退的,b)其他“控制面板”的实例需要它们自己的 Controller 实例......

我曾经让 Controller 扩展 JFrame 并让 ControlPanelOne 扩展 JPanel (以便 Controller 可以直接 add() ContollPanelOne 的实例,而不是调用 ControlPanelOne 的 getPanel() 方法),但我读到让类扩展此类组件而不是制作此类组件你们类的成员表现不佳。但如果回到让 Controller 和 ControlPanelOne 扩展 JFrame 和 JPanel 会有某种帮助的话……

也许我对 MVC 的想法是错误的......

请指教

最佳答案

How can I get ControlPanelOne to see and call on Controller’s update() method when ControlPanelOne’s button is pressed?

这通常是通过使用 Observer Pattern 来实现的,其中 Controller 将在某些事件发生时向要通知的 View 注册兴趣, View 将在适当的情况下在事件发生时调用每个注册方。这样, View 不关心 Controller ,只关心它需要生成适当的事件。

关于java - 如果类 B 的实例是类 A 的成员,那么当类 B 中的按钮被按下时,类 B 如何调用类 A 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805076/

相关文章:

Java 点击一个对象并输出一条消息

java - Andrjoid JNI简单,接下来返回错误

java - 线程 "AWT-EventQueue-0"java.lang.NullPointerException 中出现异常(面板在完全加载之前显示?)

java - 这可以在 Mac OSX 上实现吗?

java - 如何将 Double 值从一个 ActionListener 方法引入到另一个方法中以执行计算? java

java - 软件开发人员!不适用于 Eclipse.app 或 SpringToolSuite4.app(在 Mac 上)

java - 无法使用resttemplate使用rest api

java - 无需在浏览器中登录即可将视频上传到 youtube

java - 显示 CardLayout 的上一个选项卡

java - 将大文本解析到文本字段,如何在文本开头设置 View 位置