JPanel 重绘无法正常工作
JPanel repaint not working properly
我有一个 JPanel,class 称为 WorldPanel
(查看下面的代码),我正在使用 KeyListener() 来移动它。它移动了,所以我不认为是 KeyListener
有问题。问题是当我在 JPanel
上调用 repaint()
时,它会慢慢停止重新绘制屏幕的一部分。所以(在 1 和 0 中,0 是我的图像,1 是未重新绘制的部分)图像看起来像:
000000000000
repaint();
100000000000
repaint();
110000000000
等等
最终,整个面板停止重绘。
WorldPanel.java:
public void paintComponent(Graphics g) {
super.paintComponent(g);
//This Image is instantiated in the constructor
//worldImage = ImageIO.read(new File("H:\Java\Game\src\res\WorldBase.png"));
g.drawImage(worldImage, x, y, 6144, 4608, null);
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
实施class:
worldPanel.addKeyListener(new KeyListener(){
Timer timer = new Timer(10, new ActionListener(){
public void actionPerformed(ActionEvent e){
worldPanel.repaint();
timer.stop();
}
});
@Override
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() == KeyEvent.VK_W && worldPanel.getY() > 0){
worldPanel.setY(worldPanel.getY() + 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_A && worldPanel.getX() > 0){
worldPanel.setX(worldPanel.getX() +1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_S && worldPanel.getY() < 4608){
worldPanel.setY(worldPanel.getY() - 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_D && worldPanel.getX() < 6144){
worldPanel.setX(worldPanel.getX() -1);
timer.start();
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
});
我环顾四周,我发现的一切都说:
- 在 EDT 上调用重绘(尝试使用计时器)
- 在
paintComponent
方法中调用updateUI()(显然是某些人最不喜欢的解决方案)(试过,没用)
- 最后,致电
super.paintComponent(g)
。也试过,看paintComponent
.
问题是您正在覆盖 JComponent
方法 getX()/setX()/getY()/setY()
。这会干扰面板涂漆面积的计算。给这些方法起一个不同的名字,即:setImageX()/getImageX()
。
我有一个 JPanel,class 称为 WorldPanel
(查看下面的代码),我正在使用 KeyListener() 来移动它。它移动了,所以我不认为是 KeyListener
有问题。问题是当我在 JPanel
上调用 repaint()
时,它会慢慢停止重新绘制屏幕的一部分。所以(在 1 和 0 中,0 是我的图像,1 是未重新绘制的部分)图像看起来像:
000000000000
repaint();
100000000000
repaint();
110000000000
等等
最终,整个面板停止重绘。
WorldPanel.java:
public void paintComponent(Graphics g) {
super.paintComponent(g);
//This Image is instantiated in the constructor
//worldImage = ImageIO.read(new File("H:\Java\Game\src\res\WorldBase.png"));
g.drawImage(worldImage, x, y, 6144, 4608, null);
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
实施class:
worldPanel.addKeyListener(new KeyListener(){
Timer timer = new Timer(10, new ActionListener(){
public void actionPerformed(ActionEvent e){
worldPanel.repaint();
timer.stop();
}
});
@Override
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() == KeyEvent.VK_W && worldPanel.getY() > 0){
worldPanel.setY(worldPanel.getY() + 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_A && worldPanel.getX() > 0){
worldPanel.setX(worldPanel.getX() +1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_S && worldPanel.getY() < 4608){
worldPanel.setY(worldPanel.getY() - 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_D && worldPanel.getX() < 6144){
worldPanel.setX(worldPanel.getX() -1);
timer.start();
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
});
我环顾四周,我发现的一切都说:
- 在 EDT 上调用重绘(尝试使用计时器)
- 在
paintComponent
方法中调用updateUI()(显然是某些人最不喜欢的解决方案)(试过,没用) - 最后,致电
super.paintComponent(g)
。也试过,看paintComponent
.
问题是您正在覆盖 JComponent
方法 getX()/setX()/getY()/setY()
。这会干扰面板涂漆面积的计算。给这些方法起一个不同的名字,即:setImageX()/getImageX()
。