簡體   English   中英

在jframe游戲中繪制圖像

[英]drawing image in jframe game

我在用Java繪制圖像時遇到了一些麻煩。 沒有控制台錯誤,它會打印“繪圖”。 我相信我加載的圖片有誤,但是我找不到正確的方法。 如果有人能告訴我正確的方法,那將是很好的。

      package platformer;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.List;
import java.util.ArrayList;
import javax.swing.Timer;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.awt.Image;

public class test2 extends JPanel implements KeyListener, ActionListener {

    int Width = 1000;
    int Height = 600;
    private static Image offScreenBuffer;// needed for double buffering graphics
    private Graphics offScreenGraphics;// needed for double buffering graphics
    private BufferedImage[] img = new BufferedImage[1];

    public test2() {

    }

    public void paint(Graphics g) {

        super.paint(g);
                g.drawImage(img[0],0,0,null);
    }

    public void timer1() {
        int delay = 30; // milliseconds
        new Timer(delay, this).start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent evt) {

    }

    public static void main(String args[]) throws InterruptedException, Exception {

        test2 test2 = new test2();
        JFrame frame = new JFrame("platformer");
        frame.setSize(test2.Width, test2.Height);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.green);
        frame.add(test2);
        frame.setResizable(false);
        frame.addKeyListener(test2);
        test2.init();
        test2.timer1();
        // What to do after the program starts
        while (true) {
            test2.repaint();

        }
    }

    public void init() {


        try {
            URL url = new URL("platform.png");
            img[0] = ImageIO.read(url);
        } catch (IOException e) {
        }


    }

    public void keyTyped(KeyEvent e) {
    }
    public void keyPressed(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }



}

Swing有一個無限循環,可以為您處理事件。 您不需要while(true)循環。 配置frame.setVisible(true)所有UI后,應調用frame.setVisible(true) 我的意思是這應該是main()的最后一件事。 另外,您應該在UI線程上執行以下操作

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        frame.setVisible(true);
    }
});

所以main()應該看起來像

public static void main(String args[]) throws InterruptedException, Exception {

        test2 test2 = new test2();
        JFrame frame = new JFrame("platformer");
        frame.setSize(test2.Width, test2.Height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.green);
        frame.add(test2);
        frame.setResizable(false);
        frame.addKeyListener(test2);
        test2.init();
        test2.timer1();
        SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        frame.setVisible(true);
    }
});
    }

但是,主要問題是try ... catch init()會忽略異常。 您永遠不要把陷阱留空。 至少您應該打印一個堆棧跟蹤。 更好的是,將適當的異常添加到方法throws子句中,如下所示:

    public void init() throws IOException {
            URL url = new URL("platform.png");
            img[0] = ImageIO.read(url);
    }

請注意,如果出現問題,您將立即知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM