我有这个包含JPanel子节点的JFrame,其中显示以这种方式声明的图像。
BufferedImage image = ImageIO.read(filename);
程序正确显示图像。但唯一的是,它需要调整帧的大小以显示图像。
框架出现后是否有可能显示图像?
答案 0 :(得分:3)
您应该覆盖paintComponent(Graphics g)
并在其中绘制图像。在这种情况下,您应该为JPanel
组件执行此操作(我认为?如果不是,请对您所指的JComponent
执行此操作)。此外,由于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有了基本的了解。我想我假设太多了。值得一提的是,在实现(即可见)之前,应将所有组件添加到顶级容器中。这将确保在不必调整框架大小的情况下渲染所有内容。正如其他人所建议的那样,您可以简单地使用JLabel
呈现图片,然后将其添加到JPanel
。相反,我推广自定义绘画,这是完全可以接受的,对我来说,更清洁。
答案 1 :(得分:1)