在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。我不认为一个图形首先需要初始化,但我得到了一个编译错误,因为它可能没有,也检查和修改了