有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java Jpanel只出现了一半的时间

所以我正在尝试用java制作一个游戏,它将显示一个网格图像作为背景,因为现在它只是草地,偶尔会有岩石作为我的图像,当它工作时,我会像预期的那样,得到一个32×32图像的大网格显示,但大约三分之二的时间,我的面板上什么都没有出现

为了解决这个问题,我已经删除了很多特性,当我运行代码时,即使没有每秒重新绘制几次,它也只会在某些时候起作用

主课

import javax.swing.JFrame;


public class Main {



    public static void main(String[] args) {
        //Creating a new frame for the whole game and everything
        JFrame frame = new JFrame("Lawlz this is my game");
        frame.setSize(800,800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);

        //adding the game panel to the main frame
        frame.add(new GameFrame());
    }

}

Game Frame类(制作窗格的地方)这是几乎所有内容都被注释掉的代码。即使是动画和播放器类,但它仍有一半的时间不会显示任何内容

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GameFrame extends JPanel {//implements ActionListener {

    Timer mainTimer;
    Player player;
    Random rand = new Random();
    Grid GameGrid = new Grid(25, 25);

    int enemyCount = 5;

    //Constructer!
    public GameFrame()
    {
        setFocusable(true);
        //player = new Player(100,100);
    }

    //Does all of the drawing for the game
    public void paint(Graphics g)
    {
        //Sends to the JPanel class (super class)
        super.paint(g);

        //gets a graphics 2d object
        Graphics2D g2d = (Graphics2D)g;

        GameGrid.draw(g2d);
    }
}

GameGrid类基本上包含很多“网格空间”对象,每个对象基本上只是一个图像。此时,它还负责打印使用draw()方法绘制的大部分内容

import java.awt.Graphics2D;
import java.util.ArrayList;


public class Grid {

    ArrayList<GridSpace> grid = new ArrayList<GridSpace>();
    int width;
    int height;

    public Grid(int w, int h)
    {
        width = w;
        height = h;

        //Temporary for creating the x and y values by using the size of the images
        int gw = new GridSpace(0,0).getGridImg().getWidth(null);
        int gh = new GridSpace(0,0).getGridImg().getHeight(null);

        for(int i = 0; i < h; i++)
        {
            for(int n = 0; n < w; n++)
            {
                grid.add(new GridSpace(n*gw,i*gh));   //GridSpace(n*ImageWidth, i*ImageHeight)
            }
        }
    }

    public void draw(Graphics2D g2d)
    {
        for(int i = 0; i < width; i++)
        {
            for(int n = 0; n < height; n++)
            {
                GridSpace tempSpace = GetGridSpaceByID(GetCoordinates(n,i)); //gets the GridSpace object for this corrdinate
                g2d.drawImage(tempSpace.getGridImg(),tempSpace.x,tempSpace.y,null);
            }
        }
    }

    public void test(Graphics2D g2d)
    {
        GridSpace tempSpace = GetGridSpaceByID(GetCoordinates(0,0));
        g2d.drawImage(tempSpace.getGridImg(),tempSpace.x,tempSpace.y,null);
    }

    public GridSpace GetGridSpaceByID(int n)
    {
        return grid.get(n);
    }

    public int GetCoordinates(int x, int y)
    {
        return x + y * width;
    }


}

最后是GridSpace对象,它基本上只存储一个图像

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.util.Random;

import javax.swing.ImageIcon;


public class GridSpace {
    Random r = new Random();
    ImageIcon ic;
    int x = 0;
    int y = 0;

    public GridSpace(int x,int y)
    {
        this.x = x;
        this.y = y;

        //Stores an image for this grid space
        //ic = new ImageIcon("C:\\Users\\Ben\\Desktop\\pic1.png");
        if(r.nextInt(10) < 9)
        {
            ic = new ImageIcon("C:\\Users\\Ben\\Desktop\\Video Game\\grass1.jpg");
        }
        else
        {
            ic = new ImageIcon("C:\\Users\\Ben\\Desktop\\Video Game\\grass2.jpg");
        }
    }

    public Image getGridImg()
    {
        //Image image = ic.getImage();
        return ic.getImage();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    如果在主线程中调用与Swing相关的代码,其中一些问题也会出现。尝试在EDT(事件调度线程)中执行此操作

    为此,请将Main类更改为:

    import javax.swing.JFrame;
    
    public class Main {
    
        public static void main(String[] args)
        {
            javax.swing.SwingUtilities.invokeLater (new Runnable ()
            {
                public void run ()
                {
                    //Creating a new frame for the whole game and everything
                    JFrame frame = new JFrame("Lawlz this is my game");
                    frame.setSize(800,800);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                    frame.setResizable(false);
    
                    //adding the game panel to the main frame
                    frame.add(new GameFrame());
                }
            });
        }
    }
    

    有关更多详细信息,请参见here