我有一个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);
答案 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