在JFrame中显示图像

8

我目前正在学习Java,但遇到了一些问题。

我想知道如何将图片添加到我的JFrame中,于是在网上搜索得到以下代码:

ImageIcon image = new ImageIcon("path & name & extension");
JLabel imageLabel = new JLabel(image); 

在将它应用到我的代码之后,它看起来像这样(以下是相关部分):

class Game1 extends JFrame
{
    public static Display f = new Display();
    public Game1()
    {
        Game1.f.setSize(1000, 750);
        Game1.f.setResizable(false);
        Game1.f.setVisible(true);
        Game1.f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Game1.f.setTitle("Online First Person Shooter");

        ImageIcon image = new ImageIcon("C:\\Users\\Meneer\\Pictures\\image.png");
        JLabel imageLabel = new JLabel(image); 
        add(imageLabel);
        }
}

class Display extends JFrame
{
}

运行这段代码时,没有错误提示,但是图片也没有显示出来。我看到一些人遇到了同样的问题,但他们的代码与我的完全不同,他们使用了其他方法来显示图像。

add(imageLable)之后保留setVisible(true) - Anirban Nag 'tintinmj'
5个回答

8
  1. 不需要在Game JFrame内部使用另一个JFrame实例。
  2. 从构造函数调用setVisible(flag)不是首选。最好从外部初始化您的JFrame并将setVisible(true)放在事件分派线程中,以使用SwingUtilities.invokeLater(Runnable)来维护Swing的GUI渲染规则。
  3. 不要通过JFramesetSize(Dimension)给出大小提示。相反,使用适当的布局与组件,并在将所有相关组件添加到JFrame后调用pack()
  4. 尝试使用带有JLabelJScrollPane,以获得比标签大小更大的图像更好的用户体验。

以上所有描述都包含在以下示例中:

     class Game1 extends JFrame
    {
       public Game1()
      {
         // setSize(1000, 750);  <---- do not do it
         // setResizable(false); <----- do not do it either, unless any good reason

         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setTitle("Online First Person Shooter");

         ImageIcon image = new ImageIcon("C:\\Users\\Meneer\\Pictures\\image.png");
         JLabel label = new JLabel(image);
         JScrollPane scrollPane = new JScrollPane(label);
         scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
         add(scrollPane, BorderLayout.CENTER);
         pack();
      }

     public static void main(String[] args)
     {
        SwingUtilities.invokeLater(new Runnable() {

           @Override
           public void run() {
              new Game1().setVisible(true);
           }
        });

      }
    }

5
在创建JLabel之后执行此操作。
imageLabel.setBounds(10, 10, 400, 400);
imageLabel.setVisible(true);

同时将布局设置为JFrame。

Game.f.setLayout(new FlowLayout);

@alex2410,不用担心。楼主认为这是最佳答案 ;) - Sage
它是alex2410。感谢您的回答AJ :)! - user2988879

0

您将标签添加到了错误的JFrame上。同时,将setVisible()方法移动到最后。

import javax.swing.*;
class Game1 extends JFrame
{
    public static Display f = new Display();
    public Game1()
    {
        // ....
        Game1.f.add(imageLabel);
        Game1.f.setVisible(true);
    }
}

0

同时尝试使用资源中的图像,而不是从您的PC硬编码路径中获取。 您可以在这里查看,有人问了关于Jframe中图像的类似问题: 如何将ImageIcon添加到JFrame中?


0

你的问题在于你将你的 JLabel 添加到了 Game1,但你显示的是另一个窗口(Display f)。将 add(imageLabel); 改为 Game1.f.add(imageLabel);

建议:

1) 根据你的问题,Game1 继承了 JFrame,似乎 Display 也是一个窗口,只使用一个窗口来显示内容。

2) 使用 pack() 方法而不是 setSize(1000, 750);

3) 在构造函数的最后调用 setVisible(true);

4) 使用LayoutManager来布局组件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接