Правильная инициализация графики (или, может быть, какая-то другая вещь, я не уверен) в Java - PullRequest
0 голосов
/ 29 мая 2018

Я вернулся с новым вопросом о том же коде, что и в прошлый раз.Я взял много предложений, которые были даны, и изменил несколько вещей.Программа компилируется, но прямоугольник не отображается ни при каких входных данных.Люди в последнем обсуждении говорили, что код будет работать с исправленными проблемами, но, похоже, это не работает.Я не знаю, если это проблема с графикой (я думаю, что кто-то другой предложил сделать то, что я сделал в коде, который я имею сейчас) или с тем, как я принимаю ключевые входные данные.

В любом случае, в программе, представленной ниже, должен быть нарисован прямоугольник, и для этого прямоугольника необходимо переместить его на одну координату вправо или влево в зависимости от того, нажата ли клавиша <- или -> на клавиатуре.Тем не менее, ни один прямоугольник не появляется с любым вводом.

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;
     }
}

Также я хочу использовать апплет, а не JFrame.Просто личное предпочтение.Спасибо за любую помощь!^. ^

1 Ответ

0 голосов
/ 29 мая 2018

Прежде всего графика предоставляется вашему апплету.Это абстрактный класс, и когда вы используете апплет, 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;
     }
}
...