java - ImageIcon 不显示在 java 中

标签 java macos swing fullscreen imageicon

此代码应该显示背景图像和播放器。但它只是出现了一个粉红色的屏幕。我真的不知道问题出在哪里,这是我的代码。

package main;

import java.awt.*;
import javax.swing.ImageIcon;    
import javax.swing.JFrame;

public class Images extends JFrame {

    public static void main(String Args[]) {

        DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); // This is going to take 4 parameter, first 2 is x and y for resolotion. Bit depth, the number of bits in a cloour
                                                                                            // 16 is your bit depth. the last one is the monitor refresh, it means it will refres how much it wants
        Images i = new Images(); // making an object for this class
        i.run(dm); // making a run method and is taking the dm as a parameter, in this method we are putting stuff on the screen.
    }

    private Screen s; // Creating the Screen, from the Screen.java
    private Image bg; // Background
    private Image pic; // Face icon
    private boolean loaded; // Making the loaded

    //Run method
    private void run(DisplayMode dm) { // this is where we do things for the screen
        setBackground(Color.PINK); // Setting the Background
        setForeground(Color.WHITE); // Setting the ForeGround
        setFont(new Font("Arial", Font.PLAIN, 24)); // setting the font

        s = new Screen(); // now we can call ALL methods from the Screen object
        try {
            s.setFullScreen(dm, this); // This is setting the full screen, it takes in 2 parameters, dm is the display mode, so its setting the display settings, the next part is the this, what is just s, the screen object.
            loadpics(); // calling the loadpics method
            try { // so if that try block works, then it will put it to sleep for 5 seconds
                Thread.sleep(5000); // its doing this because, at the bottom (s.restorescreen) this makes it into a window again. so it needs to show it for 5 seconds.
            } catch (Exception ex) {
            }
        } finally {
            s.restoreScreen();
        }
    }

    // Loads Pictures
    private void loadpics() {
        System.out.println("Loadpics == true");
        bg = new ImageIcon("Users/georgebastow/Picture/background.jpg").getImage(); // Gets the background
        pic = new ImageIcon("Users/georgebastow/Picture/Player.png").getImage(); // Gets the Player
        System.out.println("Loaded == true in da future!");
        loaded = true; // If the pics are loaded then...    
    }

    public void paint(Graphics g) {
        if (g instanceof Graphics2D) { // This has to happen, its saying if g is in the class Graphics2D, so if we have the latest version of java, then this will run 
            Graphics2D g2 = (Graphics2D) g; // Were making the Text smooth but we can only do it on a graphcis2D object.
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // we are making the text aniti alias and turning it on!(it means making the text smooths! :) )
        }
        if(loaded == true){
            System.out.println("Loaded == true3");
            g.drawImage(bg,0,0,null);
            g.drawImage(pic, 170, 180, null);
            System.out.println("Loaded == true4");
        }
    }    
}

提前致谢

最佳答案

使用图像时,您希望使用 Class.getResource() 通过 URL 加载它们,这会返回一个 URL。将字符串传递给 ImageIcon 将导致通过文件系统查找图像。虽然这可能在您的 IDE 开发期间起作用,但您会发现它在部署时不起作用。最好现在就做出改变。要使用此方法,您需要这样做

ImageIcon icon = new ImageIcon(Images.class.getResource("/Users/georgebastow/Picture/background.jpg"));

不过,要使其正常工作,您的文件结构需要如下所示

ProjectRoot
          src
             Users
                  georgebastow
                            Picture
                                  background.jpg

一种更常见的方法是将图像放在 src 中的 reousrces 文件夹中

ProjectRoot
          src
             resources
                     background.jpg

并使用这条路径

ImageIcon icon = new ImageIcon(Images.class.getResource("/resources/background.jpg"));                     

构建时,IDE 会将图像传输到类路径。


旁注

  • 不要在像 JFrame 这样的顶层容器上绘画。而是使用 JPanelJComponent 并覆盖 paintComponent 方法。如果使用JPanel,还应该在paintComponent方法中调用super.paintComponent
  • Event Dispatch 运行您的 Swing 应用程序像这样的话题

    public static void main(String[] args) {
        SwingUtiliities.invokeLater(new Runnable(){
            public void run() {
                new Images();
            }
        });
    }
    

    参见 Initial Thread

  • 不要调用 Thread.sleep()。当从 EDT 运行时(就像你应该的那样),你会阻止它。如果您要查找的是动画,请改用 java.swing.Timer。即使它不是动画,仍然使用它!参见 this example用于 Timer 程序。

  • 另外正如@mKorbel 提到的,您永远不会向框架添加任何东西。

更新

运行这个例子。我还忘了提及,当您在 JPanel 上绘画时,您还想覆盖 getPreferredSize()。这将为您的面板指定尺寸。

src/resources/stackoverflow5.png

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestImage {

    public TestImage() {
        JFrame frame = new JFrame("Test Image");
        frame.add(new NewImagePanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public class NewImagePanel extends JPanel {

        private BufferedImage img;

        public NewImagePanel() {
            try {
                img = ImageIO.read(TestImage.class.getResource("/resources/stackoverflow5.png"));
            } catch (IOException ex) {
                System.out.println("Could not load image");
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 600);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestImage();
            }
        });
    }
}

关于java - ImageIcon 不显示在 java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502502/

相关文章:

按下鼠标左键时的 Java 鼠标悬停事件

java - JList 不可显示

java - DefaultMessageListenerContainer 在单个队列上使用 JMX + ActiveMQ 多个消费者进行管理

java - dom4j XPath 无法解析 xhtml 文档

macos - 拦截 OSX 上的所有出站流量

objective-c - 在 Cocoa 类中使用核心音频

java - 按下按钮时绘制线条 Swing

java - 使用 Java api 按日期搜索 Lotus Notes

java - 如何拆分字符串数组的每个元素并形成一个新数组?

linux - 从 rEFIt 中删除额外条目