1

別の匿名クラスに匿名クラスを含むコードがあり、内側の匿名クラスから外側の匿名クラスのインスタンスをアドレス指定する必要があります。コードは次のとおりです。

editTemplateButton.setAction(new AbstractAction("Edit...", GUIUtils.EDIT_ELEMENT_ICON)
        {
            {
                setEnabled(false); // disabled at start
                templatesList.addListSelectionListener(new ListSelectionListener()
                {
                    @Override
                    public void valueChanged(ListSelectionEvent e)
                    {
                        setEnabled(!templatesList.isSelectionEmpty()); // depends on selection
                    }
                });
            }

            @Override
            public void actionPerformed(ActionEvent e)
            {
                //todo
            }
        });

setEnabled()というわけで、の実装のAbstractAction中で の実装を呼び出しますListSelectionListener。今ではOKと呼ばれています。ListSelectionListenerしかし、実装を変数に入れ、異なるアクションに 2 回使用したいと考えています。どのようにすればsetEnabled()正しく呼び出すことができますか? JFrameこのコードにはメソッドも含まれていることを忘れないでくださいsetEnabled()。正しいコードの代わりに呼び出したくありません。

ご回答ありがとうございます。

更新:AbstractAction.this.setEnabled(!templatesList.isSelectionEmpty());コンパイラがエラーを報告するため、ような構造は使用できません。

4

2 に答える 2

2

読み間違えました。AbstractActionプライベートで非匿名の内部クラス (たとえばMyAction) を使用して、次のように呼び出すことができます。MyAction.this

于 2013-04-01T20:46:02.987 に答える
0

あなたが呼び出す必要があります:

AbstractAction.this.setEnabled(!(this.isSelectionEmpty()));

更新
OK、次のように進めることができます:

   final AbstractAction[] action = new AbstractAction[1];
   editTemplateButton.setAction(action[0]=new AbstractAction("Edit...", GUIUtils.EDIT_ELEMENT_ICON)
        {
            {
                setEnabled(false); // disabled at start
                templatesList.addListSelectionListener(new ListSelectionListener()
                {
                    @Override
                    public void valueChanged(ListSelectionEvent e)
                    {
                        action[0].setEnabled(!templatesList.isSelectionEmpty()); // depends on selection
                    }
                });
            }

            @Override
            public void actionPerformed(ActionEvent e)
            {
                //todo
            }
        });
于 2013-04-01T20:54:12.547 に答える