java jframe显示图片_java – JFrame没有显示图片

这有很多问题我不知道从哪里开始……

让我们从头开始……

问题#1

你在WindowPractice类中声明了一个名为steve的实例字段,这很好,但是在你的main方法中,你声明了一个名为steve的另一个变量,你正在使用对加载图像的引用…

public static void main(String[] args) {

new WindowPractice();

ImageIcon steve = new ImageIcon("C:/Users/shane/Dropbox/issue459.jpg");

JLabel imageLabel = new JLabel(steve);

}

这意味着类实例变量从不初始化并保持为null.

问题#2

虽然没有直接关系,但你永远不会从你的paint方法中调用super.paint.这是一个很大的没有,没有.您有义务维护油漆链.涂料方法很复杂,非常非常重要.

问题#3

您永远不应该覆盖顶级容器(例如JFrame),也不应该覆盖它的任何绘制方法.这有很多原因,但在前两个容器中,大多数顶级容器实际上包含许多组件(JRootPane,它包含玻璃窗格,内容窗格,图层窗格和菜单栏),可以放在您的绘画工作上而且,一般来说,它们不是双缓冲的,这意味着你的绘画更新会闪烁并且看起来很糟糕;)

你也应该避免使用paint,相反,你应该考虑使用paintComponent.

问题#4

ImageIcon不是加载图像的最佳选择.我不使用它们的主要原因是你不知道加载的图像何时才真正可用(实际上有方法,但坦率地说,ImageIO更简单).这是1999年的一个很好的功能,当拨号速度在14.4k左右时,但现在……

ImageIO支持更广泛的图像格式,支持图像的读取和写入,并保证当方法返回(成功)时,图像像素数据可供您的应用程序使用.

这是一个更好的(恕我直言)方法……

public class BetterDrawing {

public static void main(String[] args) {

new BetterDrawing();

}

public BetterDrawing() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(new PaintPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class PaintPane extends JPanel {

private BufferedImage background;

public PaintPane() {

try {

background = ImageIO.read(new File("/path/to/image"));

// Use this instead to load embedded resources instead

//background = ImageIO.read(getClass().getResource("/path/to/image"));

} catch (IOException ex) {

ex.printStackTrace();

}

}

@Override

public Dimension getPreferredSize() {

return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

if (background != null) {

int x = (getWidth() - background.getWidth()) / 2;

int y = (getHeight() - background.getHeight()) / 2;

g.drawImage(background, x, y, this);

}

}

}

}

读一读

有关更多信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值