在Java中正确初始化图形(或者我不确定是不是其他东西)

在Java中正确初始化图形(或者我不确定是不是其他东西),java,input,graphics,applet,awt,Java,Input,Graphics,Applet,Awt,我带着一个关于上次代码的新问题回来了。我采纳了很多建议,并做了一些改变。程序将编译,但不会显示任何输入的矩形。上一篇文章中的人说代码可以解决问题,但这似乎不起作用。我不知道这是否与图形(我想其他人建议我在我现在的代码中做的事情)或我接受关键输入的方式有关 无论如何,下面的程序应该绘制一个矩形,并且根据您是否按键盘上的键,将该矩形向右或向左移动一个坐标。但是,任何输入都不会显示矩形 import java.awt.*; import java.net.*; import java.util.*;

我带着一个关于上次代码的新问题回来了。我采纳了很多建议,并做了一些改变。程序将编译,但不会显示任何输入的矩形。上一篇文章中的人说代码可以解决问题,但这似乎不起作用。我不知道这是否与图形(我想其他人建议我在我现在的代码中做的事情)或我接受关键输入的方式有关

无论如何,下面的程序应该绘制一个矩形,并且根据您是否按键盘上的键,将该矩形向右或向左移动一个坐标。但是,任何输入都不会显示矩形

import java.awt.*;
import java.net.*;
import java.util.*;
import java.applet.Applet;


public class game extends Applet
{
    Thread loopThread;
    boolean left  = false;
    boolean right = false;
    int platPos = 50;


    public void run() 
    { 
        Graphics g = null;

        int i, j;
        long startTime;

        if (loopThread == null) 
        {
            loopThread = new Thread();
            loopThread.start();
        }

        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        startTime = System.currentTimeMillis();
        while(Thread.currentThread() == loopThread) 
        {
            updatePlatter(g);
        }

    }


     public void updatePlatter(Graphics g) 
    {

         if(left)
         {
             g.setColor(new Color(255,255,255)); //sets color to white
             g.fillRect(50+platPos, 200, 100, 20); //draws over whatever existing rectangle there is with white
             platPos--; 
             g.setColor(new Color(100,100,100)); //sets new color
             g.fillRect(50+platPos,200, 100,20); //draws new rectangle 
             left = false; 
         }

         if(right)
         {
             g.setColor(new Color(255,255,255));
             g.fillRect(50+platPos,200,100,20);
             platPos++;
             g.setColor(new Color(100,100,100));
             g.fillRect(50+platPos,200,100,20);
             right = false;
         }

    }

    public boolean keyDown(Event e, int key) 
    {
            if (key == Event.LEFT)
            left = true;

            if (key == Event.RIGHT)
            right = true;

            return true;
     }
}

我还想使用applet,而不是JFrame。只是个人喜好。谢谢你的帮助^

首先,图形将提供给小程序。它是一个抽象类,当您使用applet时,Java为您提供了正确的实现。你不能只是举例说明。有一些方法负责绘制/重新绘制小程序。因此,我建议使用paint方法对矩形进行初始绘制,然后在循环中调用repaint。顺便说一句,对于这样的循环,使用线程是不可读的代码(而且不起作用)。您甚至不需要run()方法;)创建小程序时,它开始工作

所以我们可以这样做:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;


public class Game extends Applet
{
    boolean left  = false;
    boolean right = false;
    int platPos = 0;


    @Override
     public void paint(Graphics g) 
    {
         g.fillRect(50+platPos, 0, 100, 20); 
         System.out.println("repaint");
         if(left)
         {

             g.setColor(new Color(255,255,255)); //sets color to white
             g.fillRect(50+platPos, 0, 100, 20); //draws over whatever existing rectangle there is with white
             platPos--; 
             g.setColor(new Color(100,100,100)); //sets new color
             g.fillRect(50+platPos,0, 100,20); //draws new rectangle 
             left = false; 
         }

         if(right)
         {
             g.setColor(new Color(255,255,255));
             g.fillRect(50+platPos,200,100,20);
             platPos++;
             g.setColor(new Color(100,100,100));
             g.fillRect(50+platPos,200,100,20);
             right = false;
         }

    }
    @Override
    public boolean keyDown(Event e, int key) 
    {
             if (key == Event.LEFT) {
                left = true;
             }

            if (key == Event.RIGHT) {
                right = true;
            }

            repaint();
            return true;
     }
}

旁注:虽然对类使用小写名称可能是另一种偏好,但我仍然建议您遵守命名约定。此外,您正在分配
Graphics g=null
,然后对其调用一系列方法。这可能行不通。@Ben是的,我想这就是问题所在。在我试图找出如何修复它/正确初始化图形之前,我想确定这是一个问题(尽管关于它的其他问题似乎采取了一种非常不同的方法,我认为我无法让我的程序这样做),你不初始化图形。小程序将其提供给您,但随后我得到一个错误,即“变量g可能尚未初始化”@VeselinDavidov。我不认为一个图形首先需要初始化,但我得到了一个编译错误,因为它可能没有,也检查和修改了