0

キーバインドされたアクションを持つ JLabel があります。いくつかのアクションに対していくつかのコードを定義しましたが、残念ながら、メソッド内 (これは main() にあります) 内に他の JLabels、JPanel、およびその他のものがあります。

アクションをパラメーターを受け取るように変更しようとしましたが、成功しませんでした。操作するパラメーターを受け取るアクションを取得するにはどうすればよいですか? 何か方法はありますか?私は見てきましたが、これはかなり具体的であり、良い例はほとんどありません。

ここに私のコードの素敵なスラブがあります:

    /*Bunch of stuff I want my actions to interact with above - another JLabel, a JPanel*/
    ImageIcon cursor = new ImageIcon("cursor.gif");
    JLabel cursorlbl = new JLabel("", cursor, JLabel.CENTER);
    Action goRight = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("lol");

        }
    };

    Action goLeft = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("lol2");
        }
    };

    Action goUp = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {


        }
    };

    Action goDown = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("lol2");

        }
    };


    cursorlbl.setFocusable(true);
    cursorlbl.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"),
            "pressed right");
    cursorlbl.getInputMap().put(KeyStroke.getKeyStroke("LEFT"),
            "pressed left");
    cursorlbl.getActionMap().put("pressed right", goRight);
    cursorlbl.getActionMap().put("pressed left", goLeft);
4

3 に答える 3

2

各アクションをサブクラスとして宣言し(これにより、とにかくMVCが分離され始めます)、親クラスのフィールドを操作する各アイテムを宣言できます。例:

// Parent Class
public class ParentClass{
//Field you want to mess with in your action
   JLabel cursorlbl = new JLabel("");

    // Action that does things
    public class MoveAction extends AbstractAction{
        char direction;

        //Constructor for action
        public MoveAction(char direction){
            this.direction = direction;
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            int change = 0;

            // Figure out how you'll be changing the variable
            if(direction == 'u' || direction == 'r'){
                change = 1;
            } else{
                change = -1;
            }

            // Apply the change to the correct variable
            if(direction == 'u' || direction =='d'){
                cursy += change;
            } else{
                cursx += change;
            }

            //Example how you can access the parent class's fields
            cursorlbl.setLocation(cursx, cursy);
        }       
    }
}

次に、アクションを設定するには、サブクラスのインスタンスを作成するだけです。

    contentArea.getActionMap().put("pressed right", new MoveAction('r'));
    contentArea.getActionMap().put("pressed left", new MoveAction('l'));
于 2012-07-12T21:50:44.400 に答える
0

アクションで表示したい他のコンポーネントを として宣言しますfinal。それは行動にそれらを見るようにします。

詳細はこちら

于 2012-07-12T17:35:56.227 に答える
0

次のように渡すことができるはずです。

// note that the JLabel is now final
final JLabel cursorlbl = new JLabel("", cursor, JLabel.CENTER);
Action goRight = new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println(cursorlbl.getText()); // has access to JLabel because it's scoped to the method/class

    }
};

これを行うと、メンテナンスの問題が発生する可能性があることに注意してください。将来の開発者 (および今から 2 週間後の自分自身) にとって不明確になる可能性があることを文書化するようにしてください。

于 2012-07-12T17:36:32.653 に答える