2

我有一个 Jpanel (p)、一个 Jframe (f) 和这个标签 (cursorlbl),我想通过箭头键四处移动。我已经在 goLeft() 方法中做了我认为合理的事情......但它不起作用。

我在这个类的顶部有一个名为 cursx 的静态文件,代码在 main.js 中。有一个名为 cursorlbl 的带有 ImagIcon 的 JLabel - 我将其声明为 final,因此我的键绑定函数可以看到它。

每当我按下左箭头键时,我希望 cursorlbl 消失并在我的 TableLayout 中出现一个空格(来自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 管理器中的一个错误。

一种解决方法是每次要更新时创建一个新标签以添加到面板中(如下所示):

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 回答