java 在JFrame中显示图像

ctzwtxfj  于 2023-02-28  发布在  Java
关注(0)|答案(5)|浏览(153)

我目前正在学习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
{
}

当运行这段代码时,它没有给予我任何错误,但它也没有显示图片。我看到一些问题和人有同样的问题,但他们的代码与我的完全不同,他们使用其他方式来显示图像。

yfjy0ee7

yfjy0ee71#

1.您不需要在GameJFrame中使用另一个JFrame示例:
1.从构造函数调用setVisible(flag)并不可取,而是从外部初始化JFrame,并将setVisible(true)放在事件调度线程内部,以使用SwingUtilities.invokeLater(Runnable)维护Swing的GUI呈现规则
1.不要通过JFramesetSize(Dimension)给予大小提示。相反,使用正确的组件布局,在将所有相关组件添加到JFrame后调用pack()
1.尝试将JScrollPaneJLabel配合使用,以获得比标签大小更大的图像的更好用户体验。
所有上述描述都在下面的示例中进行:

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);
           }
        });

      }
    }
pkwftd7m

pkwftd7m2#

在创建Jlabel后执行此操作

imageLabel.setBounds(10, 10, 400, 400);
imageLabel.setVisible(true);

还将布局设置为JFrame

Game.f.setLayout(new FlowLayout);
kb5ga3dv

kb5ga3dv3#

您将标签添加到了错误的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);
    }
}
k10s72fa

k10s72fa4#

还可以尝试使用来自资源的图像,而不是来自PC的硬编码路径。您可以查看此处,其中有人问了关于Jframe中图像的类似问题:How to add an ImageIcon to a JFrame?

w8ntj3qf

w8ntj3qf5#

接下来的问题是将JLabel添加到Game1,但显示另一个帧(Display f)。将add(imageLabel);更改为Game1.f.add(imageLabel);
建议:
1)根据您的问题:Game1扩展JFrame看起来Display也是一个帧,只使用一个帧来显示内容。
2)使用pack()方法代替setSize(1000, 750);
3)在构造结束时调用setVisible(true);
4)使用LayoutManager来布局组件。

相关问题