我正在用JFrame和JLabels创建一个非常简单的游戏,我设法让它工作,但在放置背景的时候,我发现了一个问题。我设置为背景的图像覆盖了我的另一个JLabels (它们仍然可以在后面工作,但你看不到它们)。
public class Game extends JPanel {
Player p1 = new Player(this, 'a');
Player p2 = new Player(this, 'r');
public Game() {}
public void move() {}
public void gameOver() {}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
p1.paint(g2d);
p2.paint(g2d);
}
public static void main(String[] args) throws InterruptedException, IOException {
BufferedImage img = ImageIO.read(new File(not relevant));
JFrame frame = new JFrame("Window");
JLabel background = new JLabel(new ImageIcon(img));
Game game = new Game();
frame.add(game);
frame.add(background);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
while (true) {
game.move();
game.repaint();
Thread.sleep(10);
}
}
}
我认为问题来自于使用我的类游戏(这是一个“运行”游戏的类)作为JPanel,然后主要创建一个JFrame并添加它的…如果没有办法解决这个问题,我会改变它,但我想保持它现在的样子。我已经尝试交换了:
Frame.add(游戏);frame.add(背景);
但结果是:
游戏-->背景-->您只能看到背景,但仍然可以玩游戏
背景-->游戏-->你只能看到一个小窗口(没有大小,只有最小化,最大化和关闭),但仍然可以玩游戏。
我也尝试在Game类中创建背景图像,但它不起作用。
发布于 2019-06-19 03:32:58
默认情况下,add(game)
的内容窗格使用BorderLayout,这意味着JFrame将把游戏组件放在BorderLayout的中心。一个BorderLayout一次只能有一个中心组件,因此add(background)
用背景JLabel替换了旧的中心组件(游戏)。
一个简单的解决方案是避免使用JLabel作为背景,只在paint方法中绘制背景:
g2d.drawImage(img, 0, 0, this);
p1.paint(g2d);
p2.paint(g2d);
这将需要在游戏类中有一个类型为BufferedImage (或仅为图像)的私有字段,您可以在该类的构造函数中设置该字段。
请注意,您应该几乎总是覆盖paintComponent,而不是绘制:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// ...
}
有关绘制Swing组件的所有详细信息,请参阅https://www.oracle.com/technetwork/java/painting-140037.html。
JFrame:在调用的pack()
方法时,您的background
JLabel似乎正在定义JFrame内容的大小。
一旦删除了后台JLabel,剩下的唯一组件( Game
类的实例)必须定义自己的首选大小,以便在调用JFrame的pack()
方法时,它将知道JFrame内容的大小。您可以通过让Game类显式报告其首选大小来完成此操作:
@Override
public Dimension getPreferredSize() {
return new Dimension(img.getWidth(), img.getHeight());
}
这将要求img
的类型为BufferedImage,因为在Image类中不存在零参数getWidth和getHeight方法。
https://stackoverflow.com/questions/56653002
复制相似问题