2016-06-29 18 views
0

Ich bin ein Noob-Programmierer, und ich arbeite an a little project, die ein 2D-Gitter von 1000 x 1000 booleschen Werten beinhaltet, die sich basierend auf einem Befehlsmuster ändern. "Wie viele Werte im Grid sind nach x Anweisungen wahr?" Derartiges.Animieren eines Pixelrasters in Java

Ich möchte ein wenig drehen und render die Werte als ein Raster von Pixeln, die schwarz sind, wenn ihre entsprechenden Werte falsch und weiß sind, wenn sie wahr sind und die in Echtzeit animiert wie Anweisungen verarbeitet werden, aber Ich bin ziemlich verloren - ich habe mich noch nie mit 2D-Grafiken in Java beschäftigt. Ich habe Oracle's tutorial gelesen, was geholfen hat, aber die Art und Weise, wie ich Dinge mache, unterscheidet sich ausreichend von seiner Demo, die ich immer noch verloren fühle.

Mein unmittelbarstes Problem ist, dass ich nicht einmal ein Raster von 1000 x 1000 schwarzen Pixeln mit einem BufferedImage initialisieren kann. Wenn ich meinen Code ausführe, erhält man ein sehr kleines Fenster mit nichts (Grausigkeit) darin. Kann mir jemand sagen, was ich falsch mache und wie ich vorgehen soll? Mein Code folgt:

import java.awt.image.BufferedImage; 
import java.awt.Color; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class PixelGrid extends JPanel { 

    private BufferedImage grid; 

    // Ctor initializing a grid of binary (black or white) pixels 
    public PixelGrid(int width, int height) { 
     grid = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY); 
    } 

    /** 
    * Fill an area with a given color 
    * @param color 0 for black; 1 for white 
    * @param x1 Starting x coordinate 
    * @param y1 Starting y coordinate 
    * @param x2 Ending x coordinate 
    * @param y2 Ending y coordinate 
    */ 
    public void toggleBlock(int color, int x1, int y1, int x2, int y2) { 
     if (color == 0) { 
      color = Color.BLACK.getRGB(); 
     } 
     else { 
      color = Color.WHITE.getRGB(); 
     } 
     for (int x = x1; x <= x2; x++) { 
      for (int y = y1; y <= y2; y++) { 
       grid.setRGB(x, y, color); 
      } 
     } 
    } 

    // Clear the grid (set all pixels to black) 
    public void clear() { 
     toggleBlock(0, 0, 0, grid.getWidth() - 1, grid.getHeight() - 1); 
    } 

    public static void main(String[] args) { 
     int width = 1000; 
     int height = 1000; 
     PixelGrid aGrid = new PixelGrid(width, height); 
     JFrame window = new JFrame("A Wild Pixel Grid Appears!"); 

     window.add(aGrid); // Incorporates the pixel grid into the window 
     window.pack(); // Resizes the window to fit its content 
     window.setVisible(true); // Makes the window visible 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

Beachten Sie, dass es noch gar nicht mit einem tatsächlichen 2D-Array von booleschen oder Befehlsverarbeitung befasst; Ich bin mir ziemlich sicher, dass ich das alleine bewältigen kann, aber im Moment versuche ich nur zu verstehen, wie man die grafische Komponente einrichtet.

+0

geändert wird, ich würde versuchen, die 'paintcomponent (Graphics g)' Methode überschrieben, (stellen Sie sicher, dass Sie 'super.paintComponent (g)' als die erste Zeile in der Methode aufrufen) und dann die Malerei Variable, die Sie mit dem Objekt 'Graphics' verwenden. – Orin

+0

'Ich habe das Tutorial von Oracle gelesen. - Nun, Ihr Code sieht nicht so aus wie der Code im Tutorial. 1) überschreiben Sie nicht die Methode paintComponent(), 2) Sie überschreiben nicht die Methode getPreferredSize(). "Aber die Art und Weise, wie ich die Dinge mache, unterscheidet sich ausreichend von ihrer Demo" - Malerei ist Malerei. Ich schlage vor, Sie beginnen mit dem Demo-Code aus dem Tutorial und nehmen dann Änderungen vor. Im Grunde brauchen Sie nur ein 2D-Array, das den Zustand jedes Pixels verfolgt. Dann malen Sie in der paintComponent-Methode jedes Pixel. Beginnen Sie also mit Arbeitscode und nehmen Sie Änderungen vor, anstatt von vorne anzufangen. – camickr

Antwort

3

Ihr Code erstellt eine BufferedImage, aber macht dann nichts damit (grafisch). Einige Optionen:

Option 1: paintComponent der PixelGrid Klasse außer Kraft setzen und das Bild auf die JPanel

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(grid, 0, 0, this); 
} 

Option 2 ziehen: Verwenden einer JLabel und ImageIcon

JLabel label = new JLabel(new ImageIcon(grid)); 
add(label); 

In jedem Fall müssen Sie repaint auf der Komponente alle aufrufen Zeit der BufferedImage

//some code 
    grid.setRGB(x, y, color); 
//some more code 
repaint();//or label.repaint() if Option 2 
Verwandte Themen