在 Java 中正确初始化图形(或者我不确定的其他东西)
Properly Initializing Graphics (or maybe some other thing, I am not sure) in Java
我带着一个关于与上次相同的代码的新问题回来了。我接受了很多给出的建议,并改变了一些东西。该程序编译,但没有矩形出现任何输入。上一个线程中的人说代码可以解决问题,但这似乎不起作用。我不知道这是图形问题(我认为其他人建议按照我现在的代码执行的操作)还是我接受按键输入的方式有问题。
无论如何,下面的程序应该绘制一个矩形,并且根据您是按键盘上的 <- 还是 -> 键,将该矩形向右或向左移动一个坐标。但是,没有任何输入出现矩形。
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。只是个人喜好。谢谢你的帮助! ^.^
首先将图形提供给您的小程序。它是一个抽象 class,当您使用小程序 Java 时,它会为您提供正确的实现。你不能只是实例化它。有一些方法负责绘制/重新绘制小程序。所以我建议使用 paint 方法对矩形进行初始绘制,然后在循环中调用 repaint 。顺便说一下,将线程用于这样的循环不是可读代码(而且它不起作用)。您甚至不需要 运行() 方法 ;) 当您创建小程序时它就开始工作了。
所以我们可以这样做:
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;
}
}
我带着一个关于与上次相同的代码的新问题回来了。我接受了很多给出的建议,并改变了一些东西。该程序编译,但没有矩形出现任何输入。上一个线程中的人说代码可以解决问题,但这似乎不起作用。我不知道这是图形问题(我认为其他人建议按照我现在的代码执行的操作)还是我接受按键输入的方式有问题。
无论如何,下面的程序应该绘制一个矩形,并且根据您是按键盘上的 <- 还是 -> 键,将该矩形向右或向左移动一个坐标。但是,没有任何输入出现矩形。
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。只是个人喜好。谢谢你的帮助! ^.^
首先将图形提供给您的小程序。它是一个抽象 class,当您使用小程序 Java 时,它会为您提供正确的实现。你不能只是实例化它。有一些方法负责绘制/重新绘制小程序。所以我建议使用 paint 方法对矩形进行初始绘制,然后在循环中调用 repaint 。顺便说一下,将线程用于这样的循环不是可读代码(而且它不起作用)。您甚至不需要 运行() 方法 ;) 当您创建小程序时它就开始工作了。
所以我们可以这样做:
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;
}
}