Java-可重用按钮动作处理程序概念问题

Ben*_*Ben 2 java swing jcomponent extend jbutton

首先-很抱歉,没有代码太可怕,只是我要解释的框架。它运行没有错误。

目标

我正在为GUI创建可重用的按钮类,并且每个按钮对象在单击时都需要具有不同的处理程序。我想为ClickHandler每个新按钮分配一个对象。然后,该按钮将调用init()处理程序,并继续执行。不幸的是,这存在输入问题,因为每个处理程序类都有不同的名称。

目前的进展

现在,该处理程序的类型为HandlerA,但我希望它处理任何名称,例如“ SettingsHandler”或“ GoToTheWahWah”等。

我尝试过弄乱泛型,但是由于我是新手,从Webdev的背景开始,我似乎一直在克服概念上的障碍。这是解决问题的正确方法吗?

代码

ReuseableButton.java 是可重用的类,唯一改变的是单击时的操作:

package gui;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class ReuseableButton extends JButton implements ActionListener {
  private static final long serialVersionUID = 1L;

  // I want a generic type here, not just HandlerA!
  private HandlerA ClickHandler;

  // Assemble generic button
  public ReuseableButton(Container c, String s) {
    super(s);
    addActionListener(this);
    c.add(this);
  }

  // Once again, generic type, not just HandlerA!
  public void SetClickHandler(HandlerA ch) {
    ClickHandler = ch;
  }

  // Call init() from whatever class has been defined as click handler.
  public void actionPerformed(ActionEvent e) {
    ClickHandler.init();
  }
}
Run Code Online (Sandbox Code Playgroud)

Controller.java 触发框架并根据需要组装按钮(目前只有一个按钮)。

package gui;
import javax.swing.*;
import java.awt.*;

public class Controller extends JFrame {
  private static final long serialVersionUID = 1L;


  public Controller() {
    JFrame frame = new JFrame("Handler Test GUI");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        

    Container pane = frame.getContentPane();   
    pane.setLayout(new FlowLayout());

    ReuseableButton b = new ReuseableButton(pane,"Reuseable Button A");
    // THE QUESTION IS HERE: Pass a generic object?
    b.SetClickHandler(new HandlerA());

    frame.pack();
    frame.setSize(200,200);    
    frame.setVisible(true);        
  }

  public static void main(String args[]) {
    new Controller();
  }
}
Run Code Online (Sandbox Code Playgroud)

HandlerA.java是按钮单击的随机处理程序的样本。后来,有可能是HandlerBHandlerC

package gui;

// A random handler
public class HandlerA {
  public void init() {
    System.out.println("Button clicked.");
  }
}
Run Code Online (Sandbox Code Playgroud)

首先十分感谢!

Dav*_*ave 5

你们所有的处理程序都应该实现like之类的接口Clickable。这样,接口就可以指定init函数的存在:

public interface Clickable 
{
    public void init();
}
Run Code Online (Sandbox Code Playgroud)

进行HandlerA定义:

public class HandlerA implements Clickable {
    public void init() {
       System.out.println("Button clicked.");
    }
}
Run Code Online (Sandbox Code Playgroud)