1

グラフィック エンジン ライブラリから次のコードを取得しました。

package WG;


import java.awt.*;
import java.awt.image.*;

import javax.swing.*;

public class window {

public static boolean running=true;

public static int WIDTH = 800, HEIGHT = 600;
public static String TITLE = "New Window";
public static JFrame frame;

public static int[] pixels;
public static BufferedImage img;
public static Thread thread;

public window(){}

public static void create() {

    img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();

    frame = new JFrame("WINDOW");  
    //frame.setResizable(false);
    frame.setLayout(new FlowLayout(FlowLayout.LEADING,0,0));
    frame.add(new JLabel(new ImageIcon(img)));
    frame.pack();

    //frame.setSize(WIDTH, HEIGHT);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

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

        Graphics g= bs.getDrawGraphics();  
        g.drawImage(img, 0,0, WIDTH, HEIGHT, null);
        g.dispose();
        bs.show();
}

public static void clear_screen(){
    for (int i = 0; i < WIDTH * HEIGHT; i++)
        pixels[i] =0;

};
 }

そして、メインのJavaファイルにあるこのコード:

import WG.*;

public class Main_window{

private static boolean running = true;
public static window wind = new window();
public static Thread thread;

public static void main(String[] args) {
    window.create();
    start();
}
public static void start() {
    while (running) {
        window.clear_screen();
        Forms.drawRect(0, 0, 100, 100);//my own method
        wind.render();
    }
}
 }

ここに2つの問題があります:

1-->ウィンドウ上の画像は負の座標で表示されます(長方形は100x100ではありません)

ウィンドウのサイズを変更すると、画像は 0 0 座標で描画されようとしますが、再び負の座標で描画されます。
ここに画像の説明を入力

2--> 2 つの異なるエラーが表示されます。

a) コンポーネントは有効なピアである必要がありますGraphics g= bs.getDrawGraphics(); b) バッファが作成されていませんbs.show();

これらの問題は何ですか?

このチャンネルの YouTube で、彼が Canvas などを使用しているのを見ましたが、エラーが発生していません (スイングと awt を混ぜないことは知っています)。

編集

 //from graphics library
    @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
            g.dispose();
        }
    //from the main file
    public static void start() {
            while (running) {
                window.clear_screen();  
                Forms.drawRect(0, 0, 100, 100);//my own method
                wind.frame.repaint();
            }
        }
4

2 に答える 2

4

ホストのピア コンポーネントが存在するまで、Graphicsコンテキストは有効ではありません。g例外がスローされるのは、プログラムが自由にホスト メモリまたはデバイスに書き込むと、重大な問題が発生するためです。

代わりに、ここここpaintComponent()に示すようにオーバーライドして、ローカル座標でコンポーネントのジオメトリを完全に制御します。

于 2012-06-30T18:26:09.077 に答える
2

コーディネートに間違いはありません。間違ったオブジェクトを使用しているようです。JFrame 全体の上から測定した場合、正方形は正確に 100x100であるため、負の座標は問題になりません。JFrame 自体ではなく、JFrame のコンテンツ ペインにコンポーネントを追加します。

交換:

frame.add(new JLabel(new ImageIcon(img)));

frame.getContentPane().add(new JLabel(new ImageIcon(img)));

他にも何かあるかもしれませんが、これは確かに出発点です。さらに問題が発生した場合は、Javadocを参照してください

于 2012-06-30T16:29:33.327 に答える