将png加载为精灵java

时间:2014-01-15 04:50:03

标签: java image swing jpanel

首先,我很抱歉我的英语不好。 我知道我的问题是类似的,也许和其他人一样,很多人在互联网上提出问题。但是我已经尝试了很多这样的问题,但是基本不行。简单的是我不知道我的错。

这是年代表:

我有5个类,它们是Game.java,Player.java,Menu.java,System.java和Control.java。 Control类是一个KeyListener类,因此可以通过键盘进行控制。 System类是主类,用于显示JFrame。 菜单类用于菜单,显示背景和按钮。它扩展了JPanel 。 玩家类,当然是玩家统计。 Game.java是我项目的核心,因为它控制着游戏玩法。

所以,我如何加载我的播放器的png。我的结构是系统调用菜单,然后菜单调用游戏(新游戏按钮),然后游戏调用播放器类。但是当我点击新游戏按钮或按输入时,没有任何事情发生,其他情况正常(加载背景,退出按钮)。

System.java

public class System extends JFrame{
private final int lebar=954;
private final int tinggi=540;

private static boolean[] kibod = new boolean[525];

public System(){
    this.setTitle("Unknown man Unkown power");
    this.setSize(new Dimension(lebar,tinggi));
    this.setFocusable(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setContentPane(new Menu());
    this.addKeyListener(new Control());
    this.setVisible(true);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            new Sistem();
        }
    });
}

}

Menu.java

public class Menu extends JPanel{
 private int l=954;
private int t=540;

JButton menu1=new JButton("MULAI BARU");
JButton menu2=new JButton("KELUARRR");

public Menu(){
    this.add(menu1);
    this.add(menu2);

    menu1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            new Game();
        }
    });
    menu2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            System.exit(0);
        }
    });

}
}

Player.java

public class Player extends JPanel{
private int posx=System.WIDTH/3;
private int posy=System.HEIGHT/3;

private BufferedImage im;
private Graphics gr;

public void loadl() {
    try {
        im=ImageIO.read(new File("res/glakon2.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public void paint(Graphics g) {
    gr=g;
    g.drawImage(im, posx, posy, System.WIDTH/3, System.HEIGHT/3, this);
}
public Player(){
    loadl();
}
}

Game.java

public class Game{

public Game() {

    new Player();
}
}

游戏类仍然是空的,因为我只想测试它是否显示。我试过用

加载png
URL u=this.getClass().getResource("res/glakon2.png");
im=ImageIO.read(u);

im=ImageIO.read(new File("res/glakon2.png"));

我的png是spritesheet png,只包含2张图片。那我怎么加载它? 感谢您的关注和帮助。

抱歉,我编辑了Game.java以匹配问题,真实的是Gameplay.java。

1 个答案:

答案 0 :(得分:3)

当我使用以下设置时,它可以正常工作

new ImageIcon(TestIMage.class.getResource("/res/stackoverflow5.png"));

enter image description here

package stackoverflow;

import javax.swing.*;

public class TestIMage {

    public TestIMage() {
        ImageIcon icon = new ImageIcon(TestIMage.class.getResource("/res/stackoverflow5.png"));
        JLabel label = new JLabel(icon);

        JFrame frame = new JFrame();
        frame.add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestIMage();
            }
        });
    }
}

enter image description here


编辑

此外,我认为您遇到的问题是没有优先考虑的面板。您应该@Override面板的getPreferredSize()。像这样的东西。

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DIM_W, DIM_H);
    }

此外,您应该覆盖paintComponent方法并调用super.paintComponent,而不是paint,就像这样

   @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        gr = g;
        g.drawImage(im, 0, 0, DIM_W, DIM_W, this);
    }

运行此测试。我使用了你的Player

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class TestIMage {

    public TestIMage() {

        JFrame frame = new JFrame();
        frame.add(new Player());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestIMage();
            }
        });
    }

    private class Player extends JPanel {

        private  int DIM_W;
        private  int DIM_H;

        private BufferedImage im;
        private Graphics gr;

        public void loadl() {
            try {
                im = ImageIO.read(TestIMage.class.getResource("/res/stackoverflow5.png"));
                DIM_W = im.getWidth();
                DIM_H = im.getHeight();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(DIM_W, DIM_H);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            gr = g;
            g.drawImage(im, 0, 0, DIM_W, DIM_W, this);
        }

        public Player() {
            loadl();
        }
    }
}

更新

此外,您需要确保将Player添加到顶级容器,例如JDialog。目前在Game类中,您所做的只是在Player类的实例中创建,但您永远不会将Player添加到容器中。如果您想使用JDialog,可以使用Game

进行操作
class Game extends JDialog {
    public Game(JFrame frame, boolean modal) {
        super(frame, modal);
        setLayout(new BorderLayout());
        add(new Player());

        pack();
        setVisible(true);
    }
}

actionPerformed可以执行此操作

menu1.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        new Game(System.this, true);
    }
});

更新2

  

“:)它有效,我做了测试类,并通过System类调用它,但如果我从Game类调用它,它就不会出现。而关于JDialog,是否会创建另一个JFrame?我认为它只有一个JFrame(在System类中声明)“

我不确定您的计划流程。我不知道你试图用Game课做什么。如果您希望Player位于主框架中,则必须.add(如果是框架)。您不能对Game类执行此操作,因为Game类不是组件。如果您想在按下按钮时显示CardLayout屏幕,则可以使用Player

这是一个例子

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class TestIMage {
    private Player player = new Player();
    private JPanel introPanel = new JPanel();
    private CardLayout cardLayout = new CardLayout();
    private JButton button = new JButton("View Player");
    private JPanel mainPanel = new JPanel(cardLayout);

    public TestIMage() {
        introPanel.setPreferredSize(player.getPreferredSize());
        introPanel.setLayout(new GridBagLayout());
        introPanel.add(button);

        mainPanel.add(introPanel, "introPanel");
        mainPanel.add(player, "playerPanel");

        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.show(mainPanel, "playerPanel");
            }
        });

        JFrame frame = new JFrame();
        frame.add(mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestIMage();
            }
        });
    }

    private class Player extends JPanel {


        private  int DIM_W;
        private  int DIM_H;

        private BufferedImage im;
        private Graphics gr;

        public void loadl() {
            try {
                im = ImageIO.read(TestIMage.class.getResource("/res/stackoverflow5.png"));
                DIM_W = im.getWidth();
                DIM_H = im.getHeight();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(DIM_W, DIM_H);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            gr = g;
            g.drawImage(im, 0, 0, DIM_W, DIM_W, this);
        }

        public Player() {
            loadl();
        }
    }
}

enter image description here