2

首先 - 对代码墙感到抱歉,但这并不太可怕,只是我试图解释的框架。它运行没有错误。

目标

我正在为我的 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();
  }
}

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

HandlerA.java是按钮单击的随机处理程序示例。之后,可能会有HandlerB,HandlerC等。

package gui;

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

首先十分感谢!

4

3 回答 3

5

你们所有的处理程序都应该实现一个接口之类的Clickable东西。这样,接口指定了 init 函数的存在:

public interface Clickable 
{
    public void init();
}

制作 HandlerA 定义:

public class HandlerA implements Clickable {
    public void init() {
       System.out.println("Button clicked.");
    }
}
于 2011-07-24T07:42:56.050 回答
3

在这种情况下,我建议使用继承:

public abstract class AbstractHandler {

    public abstract void init();
}

然后:

public class ConcreteHandlerA extends AbstractHandler {

    @Override
    public void init() {
        // do stuff...
    }

}

控制器

public class ReuseableButton extends JButton implements ActionListener {
    // I want a generic type here, not just HandlerA!
    private AbstractHandler ClickHandler;

    public Controller() {
        //...

        ReuseableButton b = new ReuseableButton(pane,"Reuseable Button A");
        AbstractHandler handlerA = new ConcreteHandlerA();
        b.SetClickHandler(handlerA);

        // ...
    }
}

不确定这是否是您要找的...

顺便说一句:您也可以定义AbstractHandleras an interface,但您可能还想在这里实现一些通用逻辑 - 跨处理程序共享。

于 2011-07-24T07:39:37.513 回答
3

您应该为处理程序使用接口。

public interface ClickHandler() {
    void init();
}

ReuseableButton b = new ReuseableButton(pane,"Reuseable Button A");
b.SetClickHandler(object which implements the ClickHandler interface);

这和正常的概念是一样的JButton。那里有ActionListener接口和actionPerformed方法。

PS如果我不明白你的问题,请纠正我。

于 2011-07-24T07:40:22.163 回答