さて、これについていくつかの質問と回答があるのを見ましたが、それらは私を本当に満足させるものではありませんでした.
たとえば、コンソールをプログラムしたとしましょう。これは、出力と入力の txtField/Area を備えた優れた JFrame です。ただし、このコンソールは出力だけでなく、コマンドの実行にも使用する必要があります。
このコンソールが頻繁に必要になり、コンソールのコードを変更したくないため、次のようにプログラムしました。
コンソールには、コマンドを登録する方法が 1 つあります。
console.registerCommand(String command, String methodToInvoke, Object invokeObject);
この方法を使用すると、変更や継承を必要とせずに、このコンソールをどこでも使用できます。
が書き込まれるたびにString command
、コンソールはそれが登録されたキーワードであることを認識し、リフレクションを介してメソッドを実行します。
これは良い習慣でしょうか、それとも悪い習慣でしょうか? コードのスタイリングとパフォーマンスについて!そして、私はもっとうまくできるでしょうか?
このようにリフレクションを使用して、ActionListeners を TrayIcon の MenuItems に追加するのも非常に便利です。
編集
以下の回答に:
コマンドでOKです。これを行う方法です。しかし、トレイの例では、TrayIcon を作成する TrayHelper クラスを作成しました。そこに MenuItems とその ActionListeners を追加したいのですが、すべてのオブジェクトを自分で作成してトレイに追加する必要はありません。だから私はこのような方法を書いた:
public void addMenuItem(String label, String methodToInvoke, String invokeObject);
このメソッドは、MenuItem がクリックされたときにメソッドを実行するだけでなく、最初に MenuItem を作成し、メソッドを呼び出す ActionListener をそれに追加し、それを TrayIcon に追加します。
したがって、この TrayHelper を使用するには、次のように記述します。
th.addMenuItem("Exit","exitMethod",this);//executes the exitMethod of
//this class after Menuitem Exit
//was clicked
すべてのオブジェクトを自分で書き直してトレイに追加する以外に、リフレクションなしでこれを行う方法が本当にわかりません。または私は盲目です:)
編集 2
わかりました、私は盲目でした。リフレクションなしでこれを行う方法がわかりませんでしたが、とても簡単です。
特にコマンド パターンでは。
匿名クラスのおかげで、私はそのようにすることができました。私はこの方法でコードを書く方法が本当に好きです (私は常に ActionListeners でそれを行いました)。
th.addMenuItem("Test",new Command(){
public void execute(){
//do stuff
}
});
ありがとうございました :)