cha*_*npa 6 java swing image loading jframe
我正在尝试为我的游戏引擎架构中的类构建一个简单的游戏基础.但我的JFrame只是不会显示任何东西.
我的代码目前的结构如下:
Implementation.java(这是我正在创建的Engine-package的一些任意实现)
public class Implementation {
public static void main(String[] args){
World w = new World("Hej", "M:\\workspace\\SP6\\pics\\tulips.jpg",1024,768);
}
}
Run Code Online (Sandbox Code Playgroud)
World.java
public class World extends JFrame{
private static final long serialVersionUID = 1L;
private SpritePanel spritePanel;
private JPanel bottom;
private int width;
private int height;
public World(String windowCaption, String bgPath, int width, int height){
super(windowCaption);
spritePanel = new SpritePanel(bgPath);
add(spritePanel, BorderLayout.CENTER);
System.out.println(spritePanel);
bottom = new JPanel();
bottom.add(new JLabel("Hej"));
add(bottom, BorderLayout.SOUTH);
Dimension size = new Dimension(width,height);
setSize(size);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
validate();
repaint();
}
Run Code Online (Sandbox Code Playgroud)
SpritePanel.java
public class SpritePanel extends JPanel {
private static final long serialVersionUID = 1L;
private ImageIcon background;
private ArrayList<Sprite> sprites = new ArrayList<Sprite>();
public SpritePanel(String bgPath){
background = new ImageIcon(bgPath);
setLayout(null);
Dimension size = new Dimension(background.getIconWidth(), background.getIconHeight());
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(background.getImage(), 0, 0, this);
System.out.println("painted panel");
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在的基本动作流程(从我可以看到):
事情是JPanel和SpritePanel中的paintComponent方法似乎没有被调用.如您所见,我在SpritePanel的paintComponent中添加了一个System.out.println,并且该行永远不会执行.
我注意到的另一件事是包装似乎知道组件在那里.因为如果我评论这三行
spritePanel = new SpritePanel(bgPath);
add(spritePanel, BorderLayout.CENTER);
System.out.println(spritePanel);
Run Code Online (Sandbox Code Playgroud)
运行程序时的窗口大小减小到"底部"-JPanel的大小.我看不到我添加到面板的JLabel,但窗口大小是它的大小.所以pack()方法似乎找到了我的组件的尺寸.
如果我评论添加底部面板的三条线,窗口尺寸减小到没有高度,宽度从标准图标得到.
我一直在尝试不同的东西让它工作,但无济于事.我以前用Swing编程并制作了工作程序,但我似乎无法在这里找到问题.
非常感谢帮助.
你的String路径可能有问题.你应该做什么,而不是读取文件,你应该读取一个URL,从类路径加载.在部署时,您会发现文件路径不起作用,因此最好将图像打包为嵌入式资源,将图像放在类路径中.这样做我没有问题.这就是我做的.
将路径更改为相对于类路径的路径
World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
Run Code Online (Sandbox Code Playgroud)将文件加载从我的类路径中的URL更改为加载
background = new ImageIcon(SpritePanel.class.getResource(bgPath));
Run Code Online (Sandbox Code Playgroud)将图像resources放在我的类路径中的包中

一切正常

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Implementation {
public static void main(String[] args) {
World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
}
}
class World extends JFrame {
private static final long serialVersionUID = 1L;
private SpritePanel spritePanel;
private JPanel bottom;
private int width;
private int height;
public World(String windowCaption, String bgPath, int width, int height) {
super(windowCaption);
spritePanel = new SpritePanel(bgPath);
add(spritePanel, BorderLayout.CENTER);
System.out.println(spritePanel);
bottom = new JPanel();
bottom.add(new JLabel("Hej"));
add(bottom, BorderLayout.SOUTH);
Dimension size = new Dimension(width, height);
setSize(size);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
validate();
repaint();
}
class SpritePanel extends JPanel {
private static final long serialVersionUID = 1L;
private ImageIcon background;
//private ArrayList<Sprite> sprites = new ArrayList<Sprite>();
public SpritePanel(String bgPath) {
background = new ImageIcon(SpritePanel.class.getResource(bgPath));
setLayout(null);
Dimension size = new Dimension(background.getIconWidth(), background.getIconHeight());
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background.getImage(), 0, 0, this);
System.out.println("painted panel");
}
}
}
Run Code Online (Sandbox Code Playgroud)
附注
setSize().你已经pack().无论如何最好还是打包.pack()之前setLocationRelativeTo().如果你pack() 之后,你会注意到你的框架不在所需的位置.像这样从Event Dispatch Thread(EDT)运行你的Swing应用程序
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
}
});
}
Run Code Online (Sandbox Code Playgroud)如果要使框架填满屏幕,请不要设置尺寸.不同的机器有不同的屏幕尺寸.而是使用setExtendedState(JFrame.MAXIMIZED_BOTH);
setSize()是因为你调用无论如何都不会工作pack() 后.| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |