在 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。如果你愿意看一本书,那么我推荐以下一本(或几本)(排名不分先后):
- Core JFC(第 2 版)作者:Kim Topley
- Java Swing(第 2 版),作者 James Elliott(及其他人)
- The Definitive Guide to Java Swing 约翰·祖科夫斯基
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。如果你愿意看一本书,那么我推荐以下一本(或几本)(排名不分先后):
- Core JFC(第 2 版)作者:Kim Topley
- Java Swing(第 2 版),作者 James Elliott(及其他人)
- The Definitive Guide to Java Swing 约翰·祖科夫斯基