1

したがって、通常、私は C、C++、および C# プログラマーであり、ほとんどの GUI 経験は C# WPF にあります。私は Java を使用するプロジェクトに配置されましたが、C# の語彙が Java とうまく調和していないことがわかりました。

私が遭遇した問題の 1 つは、JButtons に関するものであり、おそらく C# で「デリゲート」と呼ばれるものを持つすべてのものです。このには、次のコードがあります。

jbnButton1.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e) 
    {
        jtfInput.setText("Button 1!");
    }
});

簡単に言えば、関数がパラメーターとして定義されている (またはパラメーターとして渡されている) 場合、これは何と呼ばれますか? また、これはベストプラクティスですか?私が取り組んでいるプロジェクトでは、Initialize() 関数はボタンやチェック ボックスなどのこのような関数で満たされているため、扱いにくい関数になっています。Initialize() 内ではなく、クラス レベルで定義することをお勧めします。

これにより、別の(トップのコード例) が表示されます。これらのコード行で:

    b1.addActionListener(this);
    b3.addActionListener(this);
...
}

public void actionPerformed(ActionEvent e) {
    if ("disable".equals(e.getActionCommand())) {
        b2.setEnabled(false);
        b1.setEnabled(false);
        b3.setEnabled(true);
    } else {
        b2.setEnabled(true);
        b1.setEnabled(true);
        b3.setEnabled(false);
    }
} 

基本的に、コードは、ボタン 1 の b1 とボタン 3 の b3 のアクションを同じイベント ハンドラーに割り当てます。このイベント ハンドラーは、私が好むスコープ (ボタンが初期化されている場所の外) で定義されます。それらが異なる機能を指すようにする方法はありますか? また、電話することで

.addActionListener(this);

コンパイラは、これで actionPerformed(ActionEvent e) を使用することをどのように判断しますか? アクションが 'actionPerformed(ActionEvent e)' に解決されると事前に定義されているものはありますか?

4

3 に答える 3

1

最初の例はAnonymous Classと呼ばれます。多くの場合、リスナー ( などActionListener) に使用されますが、参照が保存されていないため、リスナーを削除する必要がない場合にのみ使用してください。

質問の 2 番目の部分では、コンパイラは を呼び出すタイミングを判断できませんactionPerformedActionListener ドキュメントで宣言されています:

アクション イベントが発生すると、そのオブジェクトの actionPerformed メソッドが呼び出されます。

したがって、アクションが発生するたびに、追加されたすべてのJButtonを呼び出すのは の責任です。actionPerformedActionListener

さまざまな方法を作成b1してb3指摘する方法はありません。これは、匿名クラスがより良い設計に役立つ場所の良い例です。

b1.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        b2.setEnabled(false);
        b1.setEnabled(false);
        b3.setEnabled(true);
    }
});

b3.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        b2.setEnabled(true);
        b1.setEnabled(true);
        b3.setEnabled(false);
    }
});

b1ラベル「無効」があると仮定します。その後this、実装する必要がなくなりますActionListener

于 2013-07-11T17:37:07.003 に答える