gpt4 book ai didi

java - paintComponent 中的图像仅在调整窗口大小后显示

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:39 25 4
gpt4 key购买 nike

我想使用 paintComponent(Graphics g) 通过 for 循环绘制一些图像。然而,JFrame 只是显示为白色屏幕,并且在我调整窗口大小后它只显示黑色背景和图像。

import java.awt.*; 
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.util.Scanner;

public class SimpleAdventure {
private JFrame frame;
private CardLayout cards;
private Container c;
private DrawPanel1 gamepanel;
private BufferedImage greentiles, pinktiles, sandtiles, charsprites;
private Image left1, right1, left2, right2, front;
private Image pinkbg, greenbg, sandbg;
private Image pinktop, greentop, sandtop;
private int charx, chary;

public SimpleAdventure()
{}
public static void main (String [] args)
{
SimpleAdventure retro = new SimpleAdventure();
retro.run();
}
public void run()
{
frame = new JFrame("Simple Adventure");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(576, 576);
frame.setVisible(true);
// frame.setResizable(false);
getImage();


c = frame.getContentPane();
cards = new CardLayout();
c.setLayout(cards);

gamepanel = new DrawPanel1();
gamepanel.setBackground(Color.black);
c.add(gamepanel, "Panel 1");
}
public void getImage()
{

try
{
greentiles = ImageIO.read(new File("greenTiles.png"));
pinktiles = ImageIO.read(new File("pinkTiles.png"));
sandtiles = ImageIO.read(new File("sandTiles.png"));
charsprites = ImageIO.read(new File("charactersheet.png"));
}
catch(IOException e)
{
e.printStackTrace();
}


left1 = charsprites.getSubimage(18, 0, 6, 6);
left2 = charsprites.getSubimage(24, 0, 6, 6);
right1 = charsprites.getSubimage(0, 0, 6, 6);
right2 = charsprites.getSubimage(6, 0, 6, 6);
front = charsprites.getSubimage(12, 0, 6, 6);

greenbg = greentiles.getSubimage(240, 0, 16, 16);
sandbg = sandtiles.getSubimage(240, 0, 16, 16);
pinkbg = pinktiles.getSubimage(240, 0, 16, 16);

greentop = greentiles.getSubimage(224, 0, 16, 16);
sandtop = sandtiles.getSubimage(224, 0, 16, 16);
pinktop = pinktiles.getSubimage(224, 0, 16, 16);
}

class DrawPanel1 extends JPanel implements KeyListener
{
// private BottomPanel lower;
public DrawPanel1()
{
/*this.setLayout(new BorderLayout());
lower = new BottomPanel();
this.add(lower, BorderLayout.SOUTH);*/
addKeyListener(this);
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);

for(int i = 0; i < 7; i++)
{
g.drawImage(greentop, 0 + (i * 96), 480, 96, 96, this);
}
System.out.println("check");
}
public void keyPressed(KeyEvent e)
{

}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
} }

最佳答案

您需要调用frame.pack() 来进行初始布局。自动调整窗口大小会导致布局固定,但 frame.setSize(...) 不会*。

frame.setVisible(true) 移动到 run 方法的末尾(即在构建所有 UI 元素之后)并将 frame. pack() 就在 frame.setVisible(true) 之前。 (感谢 Hovercraft 和 MadProgrammer 指出这一点)

*至少,如果框架不可见,它不会。如果框架已经可见,它可能会起作用;试试看。

编辑:现在我重新阅读了 javadoc,您可能根本不需要 pack - 它会为您调整框架的大小。未经测试,我想将 setVisible 移到最后会起作用;如果没有,则使用 revalidate 而不是 pack 让布局引擎运行。

编辑 2:现在我重新阅读了 javadoc,setVisible 将验证窗口是否尚未显示。因此您不需要显式调用 revalidatesetSize 将使组件无效但不会重新有效

TL;DR:值得一读,了解 Swing 中的验证和可显示性是如何工作的,这样您就不会犯我刚才犯的错误。

关于java - paintComponent 中的图像仅在调整窗口大小后显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991553/

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