首先,我很抱歉我的英语不好。 我知道我的问题是类似的,也许和其他人一样,很多人在互联网上提出问题。但是我已经尝试了很多这样的问题,但是基本不行。简单的是我不知道我的错。
这是年代表:
我有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();
}
}
游戏类仍然是空的,因为我只想测试它是否显示。我试过用
加载pngURL 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。
答案 0 :(得分:3)
当我使用以下设置时,它可以正常工作
new ImageIcon(TestIMage.class.getResource("/res/stackoverflow5.png"));
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();
}
});
}
}
编辑
此外,我认为您遇到的问题是没有优先考虑的面板。您应该@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);
}
});
“:)它有效,我做了测试类,并通过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();
}
}
}