首先抱歉有史以来最糟糕的英语。
我已经制作了移动JLabel
的代码,它运行正常。但是当我按住箭头键时,我的标签就会从JFrame
中消失。
这是我的代码:
这是我的观点:
package view;
import java.awt.BorderLayout;
import javax.swing.*;
import controller.Keys;
@SuppressWarnings("serial")
public class View extends JFrame{
public JLabel plaatje = new JLabel();
public static View instance;
public static View getInstance() {
if (instance == null) {
instance = new View();
}
return instance;
}
public View() {
setSize(700,700);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setFocusable(true);
this.addKeyListener(new Keys());
setLayout(null);
plaatje.setIcon(new ImageIcon(View.class.getResource("/images/linksloop.png")));
add(plaatje);
plaatje.setBounds(0, 500, 70, 70);
}
}
这是我的控制者:
package controller;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import view.View;
public class Keys implements KeyListener{
public boolean isLeftPressed;
public boolean isRightPressed;
public boolean isSpacePressed;
@Override
public void keyPressed(KeyEvent e) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
setLeftPressed(true);
left();
break;
case KeyEvent.VK_RIGHT:
setRightPressed(true);
right();
break;
case KeyEvent.VK_SPACE:
setSpacePressed(true);
space();
break;
}
}
});
t.start();
}
public void left(){
if (isLeftPressed == true) {
View.getInstance().plaatje.setIcon(new ImageIcon(View.class.getResource("/images/linksloop.png")));
for(int i = 0; i < 5; i++){
View.getInstance().plaatje.setLocation(View.getInstance().plaatje.getX() - 10, View.getInstance().plaatje.getY());
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
View.getInstance().plaatje.repaint();
}
}
}
public void space(){
if (isSpacePressed == true) {
for(int i = 0; i < 6; i++){
View.getInstance().plaatje.setLocation(View.getInstance().plaatje.getX(), View.getInstance().plaatje.getY() - 10);
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
View.getInstance().plaatje.repaint();
}
for(int i = 0; i < 6; i++){
View.getInstance().plaatje.setLocation(View.getInstance().plaatje.getX(), View.getInstance().plaatje.getY() + 10);
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
View.getInstance().plaatje.repaint();
}
}
}
public void right(){
if (isRightPressed == true) {
View.getInstance().plaatje.setIcon(new ImageIcon(View.class.getResource("/images/rechtsloop.png")));
for(int i = 0; i < 5; i++){
View.getInstance().plaatje.setLocation(View.getInstance().plaatje.getX() + 10, View.getInstance().plaatje.getY());
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
View.getInstance().plaatje.repaint();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public boolean isLeftPressed() {
return isLeftPressed;
}
public void setLeftPressed(boolean isLeftPressed) {
this.isLeftPressed = isLeftPressed;
}
public boolean isRightPressed() {
return isRightPressed;
}
public void setRightPressed(boolean isRightPressed) {
this.isRightPressed = isRightPressed;
}
public boolean isSpacePressed() {
return isSpacePressed;
}
public void setSpacePressed(boolean isSpacePressed) {
this.isSpacePressed = isSpacePressed;
}
}
我希望有人可以帮助我。
答案 0 :(得分:0)
你没有检查JFrame的维度(一旦打包它,以便Java知道对象的边界)。
重复其他移动命令。我发布了示例代码,但我很着急。稍后会在必要时进行编辑。