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フレームを起動し、必要に応じてボタンを組み立てます(現在、ボタンは1つだけです)。

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

        // ...
    }
}

これがあなたが探しているものであるかどうかわからない...

ところで:をAbstractHandlerとして定義することもできますが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 に答える