内部に描画できるパネルが必要です。ピクセルごとに描画できるようにしたい。
ps: 他のプリミティブの線や円は必要ありません。pps: グラフィック ライブラリは特に問題ではありません。awt、swing、qt など、何でもかまいません。通常は Bufferedimage で表されるもの、または単一のピクセルの色を設定して画面にレンダリングするようなものを持ちたいだけです。
それを行う1つの方法の例:
// Create the new image needed
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );
for ( int rc = 0; rc < height; rc++ ) {
for ( int cc = 0; cc < width; cc++ ) {
// Set the pixel colour of the image n.b. x = cc, y = rc
img.setRGB(cc, rc, Color.BLACK.getRGB() );
}//for cols
}//for rows
そして、オーバーライドされた paintComponent(Graphics g) 内から
((Graphics2D)g).drawImage(img, <args>)
正直なところ、ピクセルごとにレンダリングする必要がある場合は、研究ラボ用に作成したホットスポット視覚化ソフトウェアのためにこれを長々と行いました.
必要なのはBufferedImage.setRGB(..) です-- ピクセルごとに描画している場合、各ピクセルの RGB 値をレンダリングするアルゴリズムを実装していると思います (ヒートマップで行ったのと同じように) . これは、昔の IE 互換アプレットで使用していたものです。魔法のように機能し、それが何をしていたかを考えると比較的高速でした。
残念ながら、BufferedImage で RGB 値を直接操作すると、バッキング ビデオ メモリによってキャッシュされなくなります。
ただしJava 7以降、操作が停止してレンダリングが何度も繰り返されると、基盤となるJ2D実装が画像をビデオメモリに再キャッシュしようとするそうです。たとえば、熱をレンダリングしている間などです。マップは高速化されませんが、レンダリングされると、ウィンドウをドラッグしてアプリを操作すると、バッキング イメージ データが再高速化される可能性があります。
Bufferedimage で表される ..
そのBufferedImage
ために、表示された..
..または、単一ピクセルの色を設定してから画面にレンダリングするようなもの。
..in a JLabel
-この回答に見られるように。
もちろん、 のインスタンスを取得したらBufferedImage
、 を実行できsetRGB(..)
ます。
何かをすばやく実行したい場合は、Graphics メソッドの setColor と drawLine を使用できます。例えば:
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Set the colour of pixel (x=1, y=2) to black
g.setColor(Color.BLACK);
g.drawLine(1, 2, 1, 2);
}
私はこの手法を使用しましたが、それほど遅くはありませんでした。BufferedImage オブジェクトの使用と比較していません。
ここで少し遅くなりましたが、Screen
クラスを使用して、Java ゲーム プログラマーが行うようにいつでも行うことができます。
public class Screen {
private int width, height;
public int[] pixels;
public Screen(int width, int height) {
this.width = width;
this.height = height;
pixels = new int[width * height];
}
public void render() {
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
pixels[x + y * width] = 0xFFFFFF; //make every pixel white
}
}
}
public void clear() {
for(int i = 0; i < pixels.length; i++) {
pixels[i] = 0; //make every pixel black
}
}
}
そして、あなたのメインクラスで:
private Screen screen;
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
public void render() {
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
screen.clear();
screen.render();
for(int i = 0; i < pixels.length; i++) {
pixels[i] = screen.pixels[i];
}
Graphics g = bs.getDrawGraphics();
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
g.dispose();
bs.show();
}
それはうまくいくはずだと思います。