Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java图形更新_Java_Swing_Graphics_Ascii - Fatal编程技术网

java图形更新

java图形更新,java,swing,graphics,ascii,Java,Swing,Graphics,Ascii,嘿,我想用java制作一个简单的ascii游戏,但是我不能在按键时更新图形 我试着用箭头键控制他 这是密码 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.Timer; public class shooter exte

嘿,我想用java制作一个简单的ascii游戏,但是我不能在按键时更新图形

我试着用箭头键控制他

这是密码

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.Timer;


public class shooter extends JFrame{
    int x = 100, y = 100, dx, dy;
    Timer time;
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public void move(){
        x = x + dx;
        y = y + dx;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }

    public shooter() {
        setTitle("title of gip");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        //keep at bottom
        setVisible(true);
        //dont code here >:(
    }

    ///////////GRAPHICS ////////////////////
    public void paint(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    public void paintComponent(Graphics g){

    }
    //////////////end of graphics//////////////

    public void keyPressed(KeyEvent e){
        int pressed = e.getKeyCode();
        if (pressed == KeyEvent.VK_LEFT){
            dx = -1;
        }
        if (pressed == KeyEvent.VK_RIGHT){
            dx = 1;
        }
    }
    public void keyReleased(KeyEvent e){
        int rel = e.getKeyCode();
        if (rel == KeyEvent.VK_LEFT){
            dx = 0;
        }
        if (rel == KeyEvent.VK_RIGHT){
            dx = 0;
        }
    }
    public void actionPerformed(ActionEvent e) {
        move();
        repaint();
    }
    public static void main(String[] args){
        new shooter();


    }

} 
请帮忙
谢谢

@dann.dev发现了这个问题。您没有将关键点笔划和事件连接到主框架。 另外,我只想评论一下你画场景的方式。你应该画一个
JPanel
而不是JFrame,如果你愿意在主框架中添加按钮和菜单,这将使你的生活更轻松

覆盖并绘制
paintComponent
paint

class DrawingPanel{
    // ....
    @Override
    public void paintComponent(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    // ....
}
完成后,将此面板设置为框架的内容窗格

frame.setContentPane(new DrawingPanel());

@dann.dev已经很好地发现了这个问题。您没有将关键点笔划和事件连接到主框架。 另外,我只想评论一下你画场景的方式。你应该画一个
JPanel
而不是JFrame,如果你愿意在主框架中添加按钮和菜单,这将使你的生活更轻松

覆盖并绘制
paintComponent
paint

class DrawingPanel{
    // ....
    @Override
    public void paintComponent(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    // ....
}
完成后,将此面板设置为框架的内容窗格

frame.setContentPane(new DrawingPanel());

您尚未在框架中添加任何动作侦听器。发生这些事件时,将调用按键和动作执行方法,但仅从附加了动作侦听器或按键侦听器的对象调用

退房

简而言之,尽管您需要以下内容,
公共类TryItOut extends JFrame实现ActionListener、KeyListener{
和构造函数中的
addActionListener(this);
addKeyListener(this);


执行该操作,然后从那里开始尝试。

您尚未将任何动作侦听器添加到帧中。当这些事件发生时,将调用按键和动作执行方法,但仅从连接了动作侦听器或按键侦听器的对象调用

退房

简而言之,尽管您需要以下内容,
公共类TryItOut extends JFrame实现ActionListener、KeyListener{
和构造函数中的
addActionListener(this);
addKeyListener(this);

这样做,然后从那里开始尝试。

1)对于从键盘监听按键事件,最好实现s,例如

2) 类名应该是
公共类Shooter extends JFrame{

3) Swing的绘制方法为
public void paintComponent(图形g){

4) 主要方法是

   public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Shooter();
            }
        });
    }
编辑:

5) 通过@camickr correct noted me->应该在JComponent或JPanel上完成,或者您可以使用方法paint to the

1)来监听键盘上的按键事件,最好实现s,例如

2) 类名应该是
公共类Shooter extends JFrame{

3) Swing的绘制方法为
public void paintComponent(图形g){

4) 主要方法是

   public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Shooter();
            }
        });
    }
编辑:


5) 通过@camickr correct noted me->应该在JComponent或JPanel上完成,或者您可以使用方法paint to the

GETah同意。用户,您设置程序的方式看起来不错,但我认为您可能会有点问题,抱歉,我现在没有时间讨论它,请尝试阅读“Killer Java game Programming”,它有一些great info和一个很好的框架,用于以恒定的fps+速度绘制屏幕,用于在JPanel上绘制和覆盖paintComponent().GETah同意。用户,您设置程序的方式看起来不错,但我认为您可能会遇到一些问题,很抱歉,我现在没有时间回顾它,请尝试阅读“Killer Java game Programming”(杀手Java game Programming)。它有一些很棒的信息和一个很好的框架,用于以恒定的fps+绘制到屏幕上,用于在JPanel上绘制和覆盖paintComponent().+1,用于使用键绑定的建议,但是在Jframe上重写paintComponent()将不起作用,因为该方法未在Jframe上实现。自定义绘制应在JComponent或JPanel上完成。+1,用于使用键绑定的建议,但是重写paintComponent()在Jframe上不起作用,因为该方法没有在Jframe上实现。自定义绘制应该在JComponent或JPanel上完成。