更新:我为大家的无知而道歉。我跳得太快了,我认为我正在使用的数组类型可以在以后声明和操作。我感谢大家的反馈。
我对Java有点沮丧。我试图独立制作一个动画流畅的图形程序。为了做到这一点,我试图在按下某些两个键时对角线进行简单的方形移动。我正在通过将当前键存储在数组中并在按下特定键时向数组添加项来接近此挑战。但是,似乎Java正在捕获两个错误:一个在第42行,另一个在第58行。我认为这与我在这些行上使用Array方法的事实有关。如果我使用错误的数组方法,或者解释一种更简单的方法来完成我正在尝试的任务,有人可以纠正我吗?
以下是代码:
//Testing some of them graphics
import java.awt.*;
import java.util.Arrays;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.ImageIcon;
public class SmoothAnimations extends JPanel implements ActionListener, KeyListener
{
Timer tm = new Timer(5, this);
int x = 0, velX = 0, y = 0, velY = 0;
int numOfKeys = 0;
int currentKeys[] = {};
public SmoothAnimations(){
tm.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.blue);
g.fillRect(x,y,100,100);
}
public void actionPerformed(ActionEvent e){
if(x < 0){x = 0;velX = 0;}
if(x > 350){x = 350;velX = 0;}
if(y < 0){y = 0;velY = 0;}
if(y > 350){y = 350;velY = 0;}
x = x + velX;
y = y + velY;
repaint();
}
public void keyPressed(KeyEvent e){
numOfKeys++;
int c = e.getKeyCode();
currentKeys.add(c);
if(numOfKeys == 1){
if(c == KeyEvent.VK_LEFT){velX = -1; velY = 0;}
if(c == KeyEvent.VK_RIGHT){velX = 1; velY = 0;}
if(c == KeyEvent.VK_UP){velX = 0; velY = -1;}
if(c == KeyEvent.VK_DOWN){velX = 0; velY = 1;}
}
//left = 37, up = 38, right = 39, down = 40
if(numOfKeys == 2){
if(c == KeyEvent.VK_LEFT && currentKeys[1] == 38){velX = -1; velY = -1;}
if(c == KeyEvent.VK_LEFT && currentKeys[1] == 40){velX = -1; velY = 1;}
if(c == KeyEvent.VK_RIGHT && currentKeys[1] == 38){velX = 1; velY = -1;}
if(c == KeyEvent.VK_RIGHT && currentKeys[1] == 40){velX = 1; velY = 1;}
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){velX = 0;velY = 0;numOfKeys--;currentKeys.remove(currentKeys.length - 1);}
public static void main(String[] args) {
SmoothAnimations an = new SmoothAnimations();
JFrame jf = new JFrame();
jf.setTitle("Animations Test");
jf.setSize(500,500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(an);
}
}
答案 0 :(得分:1)
currentKeys
为int[]
而且它没有add()
方法,ArrayList
正是您要找的
答案 1 :(得分:1)
尝试将int currentKeys[] = {};
替换为ArrayList<Integer> currentKeys = new ArrayList<Integer>();
解释:Java中的数组是固定大小的数据结构。这意味着您无法向数组添加元素,因为这会改变数组的大小。您可以使用以下代码设置数组中位置的值:
currentKeys[index] = newValue;
但这当然不能改变阵列的总大小。此外,通过使用:
初始化currentKeysint[] currentKeys = {};
您正在创建一个长度为0的数组,因此它永远无法保存任何内容。
如果您确切知道其中将包含多少元素currentKeys
,则数组是合适的。从你的问题看来答案可能是2,在这种情况下你可以使用
int[] currentKeys = new int[2];
但是,如果您不知道currentKeys的最终大小或要求它在整个操作过程中动态调整大小,那么阵列是不够的。
ArrayList 是一个动态大小的数据结构,可用作数组。与数组不同,您可以向ArrayList添加元素,有效地将其大小增加1.(您还可以删除元素,减小大小)。像数组一样,您也可以get
索引处的值或设置给定索引处的值,前提是这些索引都在边界内。
ArrayList<Integer> currentKeys = new ArrayList<Integer>(); //Create an empty arraylist
currentKeys.add(2); //Add 2 to the back of the arraylist. Now [2].
currentKeys.add(3); //Add 3 to the back of the arraylist. Now [2, 3].
int first = currentKeys.get(0); //Gets the value at index 0 (0 being the first position), -> 2
currentKeys.set(1, 5); //Sets the value at index 1 to 5. Now [2, 5].
答案 2 :(得分:1)
数组没有定义add()
(或remove()
)方法。您正在寻找List
实施(LinkedList
,ArrayList
等)。
为了完整性,将元素添加到数组中的方法是通过索引进入数组。这要求您知道要添加的当前位置(因此不要覆盖其他数据),以及数组的大小(以避免单步执行)。
可以通过这个来完成:
currentKeys[currentIndex++] = c;
如果您希望使用此数组执行此操作,但是......
int currentKeys[] = {};
...这是不可能的,因为它是一个大小为0的数组 - 并且你不能索引到大小为0的数组。数组不会动态增长;它们的大小是固定的。
答案 3 :(得分:0)
Java中的数组只是数组中可以迭代的多个对象。可通过索引currentKeys[index]
访问,但不提供任何编辑数组的方法。
您正在寻找的是基于索引的内容,但具有动态添加和删除数据的方法。
java.util.List
界面为您提供(JavaDoc)。有多个List实现,但其中一个是java.util.ArrayList
。
因此,要使用该列表,以下内容可能具有灵感:
List<Integer> currentKeys = new ArrayList<>(); // Declare and initialize a List of type ArrayList
currentKeys.add(123); // add a value
currentKeys.remove(Integer.valueOf(123)); // remove the key 123
currentKeys.add(111); // add a value
currentKeys.remove(0); // remove the first entry in the list
请注意,List
Integer
可能很棘手。如果将int
传递给remove
方法,则int定义要删除的索引。如果您将Integer
传递给方法,则匹配要移除的实际对象,如上面的代码示例所示。