在 JFrame 中显示来自文件的图像

Displaying an image from file in JFrame

public class Menu extends JFrame {
private static Frame frame;
private static Canvas canvas;
private int width;
private BufferedImage testImage;
private int height;
private Graphics g;
private static int canvasWidth = 0;
private static int canvasHeight = 0;
private static final int GAME_WIDTH = 400;
private static final int GAME_HEIGHT = 250;
private static int gameWidth = 0;
private static int gameHeight = 0;
public static void getBestSize() {
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screenSize = toolkit.getScreenSize();
    
    boolean done = false;
    while (!done) {
        canvasWidth += GAME_WIDTH;
        canvasHeight += GAME_HEIGHT;
        if (canvasWidth > screenSize.width || canvasHeight > screenSize.height) {
        canvasWidth -= GAME_WIDTH;
        canvasHeight -= GAME_HEIGHT;
        done = true; 
    }
}
    int xDiff = screenSize.width - canvasWidth;
    int yDiff = screenSize.height - canvasHeight;
                                                                                                                            int factor = canvasWidth / GAME_WIDTH;
                                                                                                                            gameWidth = canvasWidth / factor + xDiff / factor;
    gameHeight = canvasHeight / factor + yDiff / factor;
    canvasWidth = gameWidth * factor;
    canvasHeight = gameHeight * factor;
}
public Menu (int w, int h) {
    getBestSize();
    height = h;
    width = w;
    frame = new Frame();
    canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(canvasWidth, canvasHeight));
    frame.add(canvas);
    makeFullscreen();
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    this.setVisible(true);
    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            Menu.quit();
        }});
    startRendering();
}       
private static void startRendering() {
    Thread thread = new Thread() {
        public void run() {
            GraphicsConfiguration gc = canvas.getGraphicsConfiguration();
            VolatileImage vImage = gc.createCompatibleVolatileImage(gameWidth, gameHeight);
            while (true) {
                if (vImage.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) {
                    vImage = gc.createCompatibleVolatileImage(gameWidth, gameHeight);
                }
                Graphics g = vImage.getGraphics();
                g.clearRect(0, 0, gameWidth, gameHeight);
                g.dispose();
                g = canvas.getGraphics();

                g.dispose();
                g = canvas.getGraphics();
            }
        }
    };          
    thread.start();
}
public static void quit() {
System.exit(0);
}
private static void makeFullscreen() {
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = env.getDefaultScreenDevice();
    if (gd.isFullScreenSupported()) {
        (frame).setUndecorated(true);
        gd.setFullScreenWindow(frame);
    }
}
public void setUpMenu() {
    this.setSize(width, height);
    this.setTitle("Masters");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    testImage = ImageLoader.loadImage("menu.png");
    g.drawImage (testImage, 20, 20, null);
    makeFullscreen();
}
    public static void main(String[] args) {
        Menu m = new Menu(1920, 1080);
        m.setUpMenu();
    }

}

这只是一个 window 全屏显示,但问题是我的 testImage 没有显示在屏幕上。有任何想法吗?我把我的图片放在正确的位置,所以这应该不是问题。

public class ImageLoader {
    public static BufferedImage loadImage(String path) {
        try {
            return ImageIO.read(ImageLoader.class.getResource(path));
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return null;
    }
}

这是我的第二个主要 class,它只是从我的文件夹中获取图像。我看过一些关于如何操作的 youtube 指南并遵循了每一步(请注意,我完全误解了这些视频并将它们混在一起,我绝不说这些视频不好 https://www.youtube.com/watch?v=oXmUp4ZTW2Q from this video i got the graphics from, https://www.youtube.com/watch?v=TQEEsR559QQ&t=2s 这个视频我已经从中获得了全屏图像),但它没有用。代码没有显示错误,只是不显示图像。

您在问题中写道...

I have watched some youtube guides

要么这些指南不好,要么你误解了它们。

你似乎让事情变得比他们需要的复杂得多。如果您只想全屏显示图像 window,下面的代码是如何做到这一点的最小示例。

import java.awt.EventQueue;
import java.awt.Frame;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Menu implements Runnable {
    private JFrame frame;

    public void run() {
        showGui();
    }

    private void showGui() {
        frame = new JFrame("Menu");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        ImageIcon ico = new ImageIcon(getClass().getResource("menu.png"));
        JLabel label = new JLabel(ico);
        frame.add(label);
        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Menu());
    }
}

在我看来,书面文字正在走向灭绝。就学习而言,我个人更喜欢书面文字而不是观看视频,但我想 设备屏幕 一代不会。

如果你愿意看书学习,推荐教程Creating a GUI With JFC/Swing。如果你愿意看一本书,那么我推荐以下一本(或几本)(排名不分先后):

  1. Core JFC(第 2 版)作者:Kim Topley
  2. Java Swing(第 2 版),作者 James Elliott(及其他人)
  3. The Definitive Guide to Java Swing 约翰·祖科夫斯基