Java Swing&键绑定 - 重新绘制光标

时间:2012-07-12 18:29:58

标签: java swing key-bindings

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

我在这个类的顶部有一个名为cursx的静态代码,代码在main中。有一个名为cursorlbl的带有ImagIcon的JLabel - 我声明它是最终的,所以我的keybind函数可以看到它。

每当我按下左箭头键时,我希望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);

2 个答案:

答案 0 :(得分: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,这可以节省大量开销 - 但我不会将其归类为永久解决方案(因为它会创建超出必要的对象)

答案 1 :(得分:0)

抱歉,我想念你,并认为你试图移动你的鼠标。

Java API中有一个名为Robot的类。它有一个名为mouseMove(int x,int y)的方法。您可能希望使用它来移动鼠标。

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