我的JLabel通过移动它离开了我的JFrame

时间:2014-09-05 15:34:49

标签: java swing jframe jlabel keylistener

首先抱歉有史以来最糟糕的英语。

我已经制作了移动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;
}


}

我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

你没有检查JFrame的维度(一旦打包它,以便Java知道对象的边界)。

  1. 获取JFrame左侧的位置。
  2. 检查getX() - 10是否不小于此值。
  3. 如果getX() - 10小于此值,请不要移动。
  4. 重复其他移动命令。我发布了示例代码,但我很着急。稍后会在必要时进行编辑。