gpt4 book ai didi

Java Swing & Keybinding - 重新绘制我的光标

转载 作者:行者123 更新时间:2023-12-04 05:39:22 26 4
gpt4 key购买 nike

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

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

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

最佳答案

我认为这是 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这可以为您节省大量开销 - 但我不会将其归类为永久解决方案(因为它会创建比必要更多的对象)

关于Java Swing & Keybinding - 重新绘制我的光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com