gpt4 book ai didi

java - ImageIcon 不显示在 java 中

转载 作者:行者123 更新时间:2023-11-29 10:02:09 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com