2

Jpanel (p)、Jframe (f)、およびこのラベル (cursorlbl) があり、矢印キーで移動したいと考えています。私は goLeft() メソッドで賢明だと思うことをしました...しかし、それは機能していません。

このクラスの先頭にある cursx という static into があり、コードは main にあります。JLabel に ImagIcon を含む cursorlbl という名前を付けます。これを final と宣言したので、キーバインド関数から参照できます。

左矢印キーを押すたびに、cursorlbl が消えて、TableLayout に 1 つ上のスペースが表示されるようにします ( http://java.sun.com/products/jfc/tsc/articles/tablelayoutから) 。

今、私が以下に投稿する大きなチャンクとして、私はこれを試してみます:

            p.remove(cursorlbl);
            cursx++; //static var im using to keep track of the cursor
            p.revalidate();
            p.repaint();
            p.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy));
            p.revalidate();
            p.repaint();

しかし、これは私のパネルとうまく合っていないようです。GUI が正しい場所に更新されません。理由はわかりません。

これは、はるかに大きい私のコードのチャンクです。

    final ImageIcon cursor = new ImageIcon("cursor.gif");
    final JLabel cursorlbl = new JLabel("", cursor, JLabel.CENTER);
    p.add( cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy));
    p.revalidate();
    p.repaint();
    f.setVisible(true);


    Action goRight = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("right");
            //p.remove(cursorlbl);
            //p.revalidate();
            //p.repaint();


        }
    };
    Action goLeft = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            cursx++;
            p.remove(cursorlbl);
            p.revalidate();
            p.repaint();
            p.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy));
            p.revalidate();
            p.repaint();

        }
    };


        p.setFocusable(true);
        p.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"),
                "pressed right");
        p.getInputMap().put(KeyStroke.getKeyStroke("LEFT"),
                "pressed left");
        p.getInputMap().put(KeyStroke.getKeyStroke("UP"),
                "pressed up");
        p.getInputMap().put(KeyStroke.getKeyStroke("DOWN"),
                "pressed down");
        p.getActionMap().put("pressed right", goRight);
        p.getActionMap().put("pressed left", goLeft);
        p.getActionMap().put("pressed up", goUp);
        p.getActionMap().put("pressed down", goDown);
4

2 に答える 2

3

これは TableLayout マネージャーのバグであると私は考えています。

1 つの回避策は、更新するたびにパネルに追加する新しいラベルを作成することです (次のように)。

Action goLeft = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        cursx--;
        contentArea.remove(cursorlbl);
        cursorlbl = new JLabel("",cursor, JLabel.CENTER);
        contentArea.add(cursorlbl, Integer.toString(cursx) +" ," + Integer.toString(cursy));
        contentArea.revalidate();
        contentArea.repaint();
    }
};

を再利用するImageIconことで、かなりのオーバーヘッドを節約できますが、永続的な解決策としては分類しません (必要以上のオブジェクトが作成されるため)。

于 2012-07-12T21:12:27.540 に答える
0

申し訳ありませんが、読み逃してしまい、マウスを動かそうとしていると思いました。

Java API に Robot というクラスがあります。これには、mouseMove(int x, int y) というメソッドがあります。これを使用してマウスを移動することができます。

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Robot.html

于 2012-07-12T18:41:55.917 に答える