我有这个包含 JPanel 子级的 JFrame,其中它显示以这种方式声明的图像。
BufferedImage image = ImageIO.read(filename);
程序正确显示图像。但唯一的问题是,它需要调整框架的大小才能显示图像。
框架出现后是否有可能显示图像的方法?
我有这个包含 JPanel 子级的 JFrame,其中它显示以这种方式声明的图像。
BufferedImage image = ImageIO.read(filename);
程序正确显示图像。但唯一的问题是,它需要调整框架的大小才能显示图像。
框架出现后是否有可能显示图像的方法?
您应该覆盖paintComponent(Graphics g)
并在其中绘制图像。在这种情况下,您应该为JPanel
组件执行此操作(我认为?如果不是,请为JComponent
您所指的 (s) 执行此操作)。此外,由于 Swing 不是线程安全的,因此请确保在EDT
.
例子
public class Demo{
private static BufferedImage bi;
public static void main(String[] args){
try{
loadImage();
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createAndShowGUI();
}
});
}
catch (IOException e){
// handle exception
}
}
private static void loadImage() throws IOException{
bi = ImageIO.read(new File("src/resource/braveheart.PNG"));
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
Graphics g2 = g.create();
g2.drawImage(bi, 0, 0, getWidth(), getHeight(), null);
g2.dispose();
}
@Override
public Dimension getPreferredSize(){
return new Dimension(bi.getWidth(), bi.getHeight());
}
};
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
输出
重要的是要记住,这个例子忽略了渲染提示,所以当你最大化 时JFrame
,图像质量会很差。:)
编辑
在回答这个问题时,我假设您对 Swing 有基本的了解。我想我假设太多了。值得一提的是,所有组件都应在实现(即可见)之前添加到顶级容器。这将确保在无需调整框架大小的情况下渲染所有内容。正如其他人所建议的那样,您可以简单地使用 aJLabel
来渲染图像,然后将其添加到您的JPanel
. 相反,我提倡定制绘画,这是完全可以接受的,对我来说,更干净。