简体   繁体   中英

Why Won't the Screen Change Color

I looked and the codes seems fine to me. Got an error but hopefully it's the source code, not something wrong with the cpu I have nor JDK.

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.*;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {
public static int width = 300;
public static int height = width / 16*9;
public static int scale = 3;

private Thread thread;
private boolean running = false;
private JFrame frame;

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}
public synchronized void stop() {
    running = false;

    try{
        thread.join();
    }catch(InterruptedException e){
        e.printStackTrace();
    }
}

public void run(){
    while(running){
        tick();
        render();
    }
}

public void tick() {

}

public void render() {
    BufferStrategy bs = getBufferStrategy();
    if(bs==null){
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.black);
    g.fillRect(0, 0, getWidth(), getHeight());
    bs.dispose();
    bs.show();

}

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

    frame = new JFrame();
}

public static void main(String[] args) {
    Game game = new Game();

    game.frame.setResizable(false);
    game.frame.setTitle("Title");
    game.frame.add(game);
    game.frame.pack();
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.frame.setLocationRelativeTo(null);
    game.frame.setVisible(true);

    game.start();
}
}

Then I got this error, even when I countlessly modified the source code I had.

Exception in thread "Display" java.lang.NullPointerException
at java.awt.Component$BltBufferStrategy.showSubRegion(Component.java:4307)
at java.awt.Component$BltBufferStrategy.show(Component.java:4255)
at com.thecherno.Rain.Game.render(Game.java:58)
at com.thecherno.Rain.Game.run(Game.java:39)
at java.lang.Thread.run(Thread.java:695)

Im starting to seem if it because of an outdated JDK. Current Version I have is JDK 6.

You state:

What Im trying to do is change color as seen in the render method. The background to be black.

  • Use Swing components such as a JComponent or JPanel.
  • Simply call setBackground(Color.BLACK) on the component will do.
  • You appear to be creating a game loop of some type. Consider using a Swing Timer for this.

eg,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Game2 extends JPanel {
   private static final int PREF_W = 300;
   private static final int PREF_H = PREF_W / 16 * 9;
   private static final int SCALE = 3;
   private static final Color BACKGROUND = Color.BLACK;
   private static final int TIMER_DELAY = 20;
   private Timer swingTimer;

   public Game2() {
      setBackground(BACKGROUND);
      swingTimer = new Timer(TIMER_DELAY, new TimerListener());
      swingTimer.start();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);   
      // TODO: add any custom painting here
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W * SCALE, PREF_H * SCALE);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         // TODO add code that gets called in game loop
      }
   }

   private static void createAndShowGui() {
      Game2 mainPanel = new Game2();

      JFrame frame = new JFrame("Game2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Note that this code is based on your stated requirements and what I'm guessing are other requirements based on your code. If there are further requirements not mentioned, please elaborate them for us.

Try using g.dispose(); followed by bs.show(); and then g = (Graphics2D)bs.getDrawGraphics(); . I know it looks weird, but you are emptying the canvas and then refilling it using your strategy. You may also need to do an initial check for g being null and initialize it before the first display loop.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM