0

imageicons を jframe にロードしようとしています。このコードが機能しない理由がわかりません。jpanels と jlabels を使用してみましたが、画像をロードする他の方法も試しましたが、どちらも機能しません。このため、私が設定した JFrame と関係があると思います。少なくとも私の知る限り、それらはスケーリングできないため、jpanels と jlabels には近づきません。誰かが画像を追加する解決策を持っている場合は教えてください。コードは次のとおりです。

import java.awt.Canvas;
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.ImageIcon;
import java.awt.event.KeyEvent;
import java.awt.Graphics;


public class Base extends Canvas implements Runnable {

    private static final long serialVersionUID = 001;
    private Image rock1;
    private Image rock2;
    private Image wood1;

    private Thread thread;
    private boolean running = (false);
    private boolean paused = (false);

    int x = 0;
    int y = 0;
    int z = 512;


    private void start() {
        if (running)
            return;
        running = true;
        thread = new Thread(this);
    }

    public void run(){}

    public Base(){}

    public static void main(String[] Args) {
        Base game = new Base();
        JFrame frame = new JFrame();
        frame.add(game);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setTitle("Game");

        System.out.println("Running...");

        game.start();
        game.loadPics();

    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_A) {
            x = x - 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            x = x + 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            y = y - 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
            y = y + 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_W) {
            z = z + 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            z = z - 5;
        }
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
            paused = (true);
        }
    }

    public void loadPics(){

        rock1 = new ImageIcon("C\\...\\rock1.png").getImage();
        rock2 = new ImageIcon("C\\...\\rock2.png").getImage();
        wood1 = new ImageIcon("C\\....\\wood1.png").getImage();

        repaint();
    }

    public void paint(Graphics g){
        while(paused = false){
        g.drawImage(rock1, x, y, z, z, this);
        g.drawImage(rock2, x + 512, y, z, z, this);
        g.drawImage(wood1, x, y + 512, z, z, this);

        try{
            Thread.sleep(16);
        }catch(Exception e){}
        g.dispose();
        }

    }
}

繰り返しますが、問題は私の JFrame にあると思いますが、私は最も経験豊富な Java プログラマーではないため、確信が持てません。とにかく、解決策または何を変更すべきかを知っている場合は、助けてください。

4

2 に答える 2

0

私はこのような問題を何度も繰り返しており、これを解決する方法を開発しました。まず、public class Baseダブル バッファリングが必要です。メソッドpaint(Graphics g)を に変更しpaintComponent(Graphics g)ます。新しいpaint(Graphics g)メソッドを追加し、次のコードを追加します。

 public void paint(Graphics g) {
    // TODO Auto-generated method stub (IGNORE!!!)

    dbi = createImage (getWidth(),getHeight());
    dbg = dbi.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbi , 0 , 0 , this);

 }

の上部にpublic class Base、次の変数を追加します。

 private Image dbi;
 private Graphics dbg;

これにより、最初のステップが自動的に呼び出さpaintComponent(Graphics g)れて完了します。

次に、try文を削除して、paintComponent()これを書き込みますrun()

@Override
public void run() {

    try {

        while (true) {

            Thread.sleep(5); // we want this so the computer doesn't go too fast

        }

    } catch (Exception e) { // Never have an empty catch statement

        System.out.println ("Error! stacktrace: ");
        e.printStackTrace();

    }

} 

@Override注釈そこになければなりません。そうしないと、再描画されません。

次の部分は重要です。何よりもまずsuper.paint(g);、上部paintComponent(Graphics g)repaint();下部に配置します。

これで解決したはずですが、潜在的な問題がいくつか見つかりました。

  • JFrame の初期化

    public Base(){
    
        add(game);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        setTitle("Game");
    
        start();
        loadPics();
    
    }
    
    public static void main(String[] Args) { // Makes game smoother
    
        Base base = new Base ();
        Thread t = new Thread (base);
        t.start();
    
    }
    
  • private void start()これはゲームプレイに影響しないため削除してください。

  • ファイル ディレクトリが間違っている可能性があるため、ファイル ディレクトリを確認してください。ヒント: C\ はそれをカットしません。C:\です。

それがうまくいくことを願って、幸せなコーディングをしてください!

于 2013-07-21T00:23:41.543 に答える