簡體   English   中英

在Java中使用更新和重繪

[英]Using update and repaint in java

我之前曾問過關於同一程序的問題 我解決了我當時遇到的問題,現在我已經根除了另一個問題。 當我運行代碼時,它在屏幕上顯示一個小藍框。 當您按下箭頭鍵時它應該會移動,我發現如果您單擊字符並按住箭頭鍵片刻,它將移動。 我需要使它自動刷新屏幕,我相信我需要一個update()方法,但是我不確定。 如果有人可以幫助我解決這個問題或以某種有用的方式改進我的代碼。 我根據上一個問題收到的一些評論進行了一些更改。

CharacterTest.java:

import javax.swing.JFrame;
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.BorderLayout; 
import java.awt.Canvas;
//import java.awt.event.KeyEvent;
import java.awt.event.*;

public class CharacterTest extends JFrame{

public CharacterTest() 
{
    super("Character Test");                                //instantiate a window to draw the character in
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //this will stop the program when it closes

    setSize(800, 800);                  //create the window

    MCharacter C = new MCharacter();    //call the box so that it can be affected

    getContentPane().add(C);            //draws the character on the window

    setVisible(true);                   //show the window

    while(C.determine(C.getX(), C.getY()) == false)     //as long as the character is witin a particular area
    {
        if(C.getUpKey() == true)                //if the up arrow key is pressed
        {
            C.up();                             //set the y variable to a higher position
        }
        if(C.getDownKey() == true)              //if the down arrow key is pressed
        {
            C.down();                           //set the y variable to a lower positon
        }
        if(C.getRightKey() == true)             //if the right arrow key is pressed
        {
            C.right();                          //set the x variable ro a more right position
        }
        if(C.getLeftKey() == true)              //if the left key is pressed
        {
            C.left();                           //set the x variable to a more left position
        }
        repaint();                              //repaint the character at a new position
        try {
                Thread.sleep(20);
            }
            catch (InterruptedException ex){
            }
    }
}



public static void main(String[] args) {
    CharacterTest test = new CharacterTest();   //calls the method which creates the screeen, the character, and checks for key srokes
}
}

MCharacter.java:

import javax.swing.JFrame;
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.BorderLayout; 
import java.awt.Canvas;
//import java.awt.event.KeyEvent;
import java.awt.event.*;

public class MCharacter extends Canvas{

//these will be the instance variables for the character's parameters- its size and its location
private int width;
private int height;
private int x;
private int y;


//these will be turned true if the corresponding key is pressed - defined in the private class line 132
private boolean leftKey = false;
private boolean rightKey = false;
private boolean upKey = false;
private boolean downKey = false;


//some constructors that would easily be called
public MCharacter() 
{
    setBackground(Color.WHITE);
    setWidth(10);
    setHeight(10);
    setX(400);
    setY(400);
    addKeyListener(new MyKeyListener());        //adds a key listener as the private class below (line 152)
}

public MCharacter(int xPos, int yPos)
{
    setBackground(Color.WHITE);
    setWidth(10);
    setHeight(10);
    setX(xPos);
    setY(yPos);
    addKeyListener(new MyKeyListener());        //adds a key listener as the private class below (line 152)
}

public MCharacter(int wth, int hgt, int xPos, int yPos)
{
    setBackground(Color.WHITE);
    setWidth(wth);
    setHeight(hgt);
    setX(xPos);
    setY(yPos);
    addKeyListener(new MyKeyListener());        //adds a key listener as the private class below (line 152)
}

//setters for each of the variables
public void setWidth(int wth)
{
    width = wth;
}

public void setHeight(int hgt)
{
    height = hgt;
}

public void setX(int xPos)
{
    x = xPos;
}

public void setY(int yPos)
{
    y = yPos;
}

//getters for each of the varaibles
public int getWidth()
{
    return width;
}

public int getHeight()
{
    return height;
}

public int getX()
{
    return x;
}

public int getY()
{
    return y;
}

//used to determine if the character should move
public void setUpKey(boolean setUp)
{
    upKey = setUp;
}
public void setDownKey(boolean setDown)
{
    downKey = setDown;
}
public void setRightKey(boolean setRight)
{
    rightKey = setRight;
}
public void setLeftKey(boolean setLeft)
{
    leftKey = setLeft;
}

public boolean getUpKey()
{
    if(upKey == true) 
    {
        return true;
    }
    return false;
}
public boolean getDownKey()
{
    if(downKey == true) 
    {
        return true;
    }
    return false;
}
public boolean getRightKey()
{
    if(rightKey == true) 
    {
        return true;
    }
    return false;
}
public boolean getLeftKey()
{
    if(leftKey == true) 
    {
        return true;
    }
    return false;
}

//the following class is goign to be used to determine if an arrow key is being pressed
private class MyKeyListener extends KeyAdapter{

    public void keyPressed(KeyEvent e){
        switch (e.getKeyCode()){
            case KeyEvent.VK_LEFT:              //if left key is pressed
            setLeftKey(true);                       //set this boolean to true
            break;
            case KeyEvent.VK_RIGHT:             //if right key is pressed
            setRightKey(true);                  //set this boolean to true
            break;
            case KeyEvent.VK_UP:                //if the up key is pressed
            setUpKey(true);                     //set this boolean to true
            break;
            case KeyEvent.VK_DOWN:              //if the down key is pressed
            setDownKey(true);                       //set this boolean to true
            break;
        }
    }
    public void keyReleased(KeyEvent e){
        switch (e.getKeyCode()){
            case KeyEvent.VK_LEFT:              //if left key is released
            setLeftKey(false);                  //set this boolean to false
            break;
            case KeyEvent.VK_RIGHT:             //if right key is released
            setRightKey(false);                 //set this boolean to false
            break;
            case KeyEvent.VK_UP:                //if up key is released
            setUpKey(false);                        //set this boolean to false
            break;
            case KeyEvent.VK_DOWN:              //if down key is released
            setDownKey(false);                  //set this boolean to false
            break;
        }
    }
}

//I am going to call the paint method here and create a small box that I will use as the character
public void paint(Graphics window)
{
    window.setColor(Color.BLUE);                //sets the color of the character
    window.fillRect(x, y, width, height);       //sets the dimensions of the character
}

//this method will be used to keep checking for a key pressed: while this is false check for a keytyped
public boolean determine(int x, int y)
{
    if( x >= 10 && x <= 790 && y >= 10 && y <= 790)
    {
        return false;
    }
    return true;
}

//the following methods will be to move the character
public void up()
{
    setY(getY()-2);
}
public void down()
{
    setY(getY()+2);
}
public void right()
{
    setX(getX()+2);
}
public void left()
{
    setX(getX()-2);
}
}

為了順利進行此操作,您必須將while循環移出CharacterTest構造函數,並在單獨的Thread上執行。 還要將您的leftKeyrightKeyupKeydownKey字段定義為volatile以防止AWT / Swing事件線程與渲染線程之間出現同步問題(因為事件線程和渲染線程可能正在同時訪問這些字段)。

如果您從自己的單獨線程執行Canvas的repaint() ,則還應該在MCharacter的構造函數中設置setIgnoreRepaint(true) ,以防止Swing也重繪您的Canvas。

另外,為了使代碼更具可讀性,建議您在MCharacter定義一個名為move()的方法,並在其中執行while循環的內容(“移動”字符是有意義的)。 帶有循環的run()方法將如下所示:

@Override public void run() {
    while (character.determine()) {
        character.move();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM