gpt4 book ai didi

java - 我的 JFrame 没有显示任何内容

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:42 27 4
gpt4 key购买 nike

我正在尝试为我的游戏引擎架构类(class)构建一个简单的游戏基础。但是我的 JFrame 不会显示任何内容。

我的代码目前结构如下:

Implementation.java(这是我正在创建的引擎包的任意实现)

public class Implementation {
public static void main(String[] args){
World w = new World("Hej", "M:\\workspace\\SP6\\pics\\tulips.jpg",1024,768);
}
}

世界.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();
}

Sprite 面板.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");
}
}

所以目前的基本操作流程(据我所知):

  1. 我在实现中创建了一个新的 World 对象
  2. 使用给定的参数调用 World-constructor
  3. 设置窗口标题(有效)
  4. 我使用给定的 bgPath 创建一个新的 SpritePanel 对象
  5. 调用 SpritePanel 构造函数并将 ImageIcon 设置为给定路径中存在的图像
  6. SpritePanel 添加到 BorderLayout.CENTER 中的框架
  7. 我将新的 JPanel 添加到 BorderLayout.CENTER 中的框架
  8. 我设置尺寸和东西
  9. 我打包并将框架设置为可见
  10. 我验证并重新绘制

问题是 JPanel 和 SpritePanel 中的 paintComponent 方法似乎没有被调用。如您所见,我在 SpritePanel 的 paintComponent 中添加了一个 System.out.println,并且该行从未执行过。

我注意到的另一件事是,狼群似乎知道组件在那里。因为如果我评论这三行

spritePanel = new SpritePanel(bgPath);
add(spritePanel, BorderLayout.CENTER);
System.out.println(spritePanel);

当我运行程序时,窗口大小缩小到“底部”-JPanel 的大小。我看不到我添加到面板的 JLabel,但窗口大小就是它的大小。所以 pack() 方法似乎是在寻找我的组件的尺寸。

如果我评论添加底部面板的三行,窗口大小将减小到没有高度和它从标准图标获得的宽度。

我一直在尝试不同的方法来让它工作,但无济于事。我以前用 Swing 编程过并制作了工作程序,但我似乎无法在这里找到问题。

非常感谢帮助。

最佳答案

您的字符串路径可能有问题。但是你应该做的是,你应该读取一个 URL,而不是读取一个文件,从类路径加载。在部署时,您会发现文件路径不起作用,因此最好将您的图像打包为 embedded resource。 ,将图像放在类路径中。这样做时我没有遇到任何问题。这就是我所做的。

  • 将路径更改为相对于我的类路径的路径

    World w = new World("Hej", "/resources/stackoverflow5.png", 1024, 768);
  • 从文件加载更改为从我的类路径中的 URL 加载

    background = new ImageIcon(SpritePanel.class.getResource(bgPath));
  • 将图片放在我类路径的resources包中

enter image description here

一切正常

enter image description here

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");
}
}
}

边注

  • 无需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);
    }
    });
    }
  • 如果您想让框架填满屏幕,请不要设置尺寸。不同的机器有不同的屏幕尺寸。而是使用 setExtendedState(JFrame.MAXIMIZED_BOTH);

  • 此外,您的 setSize() 无论如何都不会工作,因为您在 之后调用 pack()

关于java - 我的 JFrame 没有显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21382726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com