在JavaJFrame中放置图像
我已经尝试了一段时间,试图将一个图像加载到这个JFrame中,以便它显示它,但没有成功。代码如下:在JavaJFrame中放置图像,java,swing,jframe,jpanel,draw,Java,Swing,Jframe,Jpanel,Draw,我已经尝试了一段时间,试图将一个图像加载到这个JFrame中,以便它显示它,但没有成功。代码如下: import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.event.KeyEvent; import java.awt.event.KeyLis
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
public class Main extends JPanel{
Bird bird = new Bird(this);
public void paint(Graphics g){
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
bird.paint(g2D);
}
public static void main(String[] args)throws InterruptedException{
JFrame frame = new JFrame("Java Birds");
Main game = new Main();
frame.add(game);
frame.setSize(500, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true){
game.repaint();
Thread.sleep(10);
}
}
}
这是我的鸟课:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
public class Bird {
private static final Image sprite = Toolkit.getDefaultToolkit().getImage("bird.jpeg");
private static final int DIAMETER = 30;
double g = 0.12, vy = 0, xo = 100, yo = 10;
private Main game;
public Bird(Main game){
this.game = game;
}
public void paint(Graphics2D g){
g.setColor(Color.BLACK);
g.drawImage(sprite, 30, 30, game);
}
}
当我运行此命令时,屏幕上不会显示任何内容,但如果我放置g.fillOval指令,则面板中会出现一个圆圈。非常感谢您的帮助。要显示充满整个面板的图像,您应该具备以下功能。可以使用从文件中读取图像(可以在
paintComponent
方法中调整图像的位置和大小)。你可能也想看看
主测试仪:
public static final String TEST_FILE = "file path here";
public static void main(String... args) throws IOException {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JFrame frame = new JFrame();
final JComponent picture = new PictureFrame(TEST_FILE);
frame.setContentPane(picture);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setVisible(true);
}
要显示填充整个面板的图像,应具备以下条件。可以使用从文件中读取图像(可以在
paintComponent
方法中调整图像的位置和大小)。你可能也想看看
主测试仪:
public static final String TEST_FILE = "file path here";
public static void main(String... args) throws IOException {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JFrame frame = new JFrame();
final JComponent picture = new PictureFrame(TEST_FILE);
frame.setContentPane(picture);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setVisible(true);
}
要显示填充整个面板的图像,应具备以下条件。可以使用从文件中读取图像(可以在
paintComponent
方法中调整图像的位置和大小)。你可能也想看看
主测试仪:
public static final String TEST_FILE = "file path here";
public static void main(String... args) throws IOException {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JFrame frame = new JFrame();
final JComponent picture = new PictureFrame(TEST_FILE);
frame.setContentPane(picture);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setVisible(true);
}
要显示填充整个面板的图像,应具备以下条件。可以使用从文件中读取图像(可以在
paintComponent
方法中调整图像的位置和大小)。你可能也想看看
主测试仪:
public static final String TEST_FILE = "file path here";
public static void main(String... args) throws IOException {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JFrame frame = new JFrame();
final JComponent picture = new PictureFrame(TEST_FILE);
frame.setContentPane(picture);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setVisible(true);
}
有一系列问题,首先
public void paint(Graphics g){
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
bird.paint(g2D);
}
您正在重写paint
,不建议这样做,建议您改为重写paintComponent
另一个问题是
Toolkit.getDefaultToolkit().getImage("bird.jpeg");
问题是getImage(String)
希望传递给它的值引用文件系统中的文件。在大多数情况下,这是不正确的,图像存储为嵌入式资源,在使用中,您需要使用更像
Toolkit.getDefaultToolkit().getImage(Bird.class.getResource("bird.jpeg"));
或
仍然无法保证映像已加载,并且这些方法都无法实际告诉您映像何时失败
一个更好的解决方案是使用ImageIO
读取图像,除了支持更多格式外,当它失败时还会抛出IOException
public class Bird {
private Image sprite;
//...
public Bird(Main game) throws IOException {
image = ImageIO.read(getClass().getResource("/bird.jpeg"));
这个
while(true){
game.repaint();
Thread.sleep(10);
}
这也是非常危险的,您已经在main
方法中启动了它,但是您没有考虑调用哪个线程main
。在“正常”操作中,JVM从所谓的“主线程”调用main
,但不能保证这就是调用main
方法的方式。它可能被EDT上下文中的另一个类调用,这将导致程序冻结
通常,您应该使用一个
javax.swing.Timer
或一个单独的线程
public void paint(Graphics g){
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
bird.paint(g2D);
}
您正在重写paint
,不建议这样做,建议您改为重写paintComponent
另一个问题是
Toolkit.getDefaultToolkit().getImage("bird.jpeg");
问题是getImage(String)
希望传递给它的值引用文件系统中的文件。在大多数情况下,这是不正确的,图像存储为嵌入式资源,在使用中,您需要使用更像
Toolkit.getDefaultToolkit().getImage(Bird.class.getResource("bird.jpeg"));
或
仍然无法保证映像已加载,并且这些方法都无法实际告诉您映像何时失败
一个更好的解决方案是使用ImageIO
读取图像,除了支持更多格式外,当它失败时还会抛出IOException
public class Bird {
private Image sprite;
//...
public Bird(Main game) throws IOException {
image = ImageIO.read(getClass().getResource("/bird.jpeg"));
这个
while(true){
game.repaint();
Thread.sleep(10);
}
这也是非常危险的,您已经在main
方法中启动了它,但是您没有考虑调用哪个线程main
。在“正常”操作中,JVM从所谓的“主线程”调用main
,但不能保证这就是调用main
方法的方式。它可能被EDT上下文中的另一个类调用,这将导致程序冻结
通常,您应该使用一个
javax.swing.Timer
或一个单独的线程
public void paint(Graphics g){
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
bird.paint(g2D);
}
您正在重写paint
,不建议这样做,建议您改为重写paintComponent
另一个问题是
Toolkit.getDefaultToolkit().getImage("bird.jpeg");
问题是getImage(String)
希望传递给它的值引用文件系统中的文件。在大多数情况下,这是不正确的,图像存储为嵌入式资源,在使用中,您需要使用更像
Toolkit.getDefaultToolkit().getImage(Bird.class.getResource("bird.jpeg"));
或
仍然无法保证映像已加载,并且这些方法都无法实际告诉您映像何时失败
一个更好的解决方案是使用ImageIO
读取图像,除了支持更多格式外,当它失败时还会抛出IOException
public class Bird {
private Image sprite;
//...
public Bird(Main game) throws IOException {
image = ImageIO.read(getClass().getResource("/bird.jpeg"));
这个
while(true){
game.repaint();
Thread.sleep(10);
}
这也是非常危险的,您已经在main
方法中启动了它,但是您没有考虑调用哪个线程main
。在“正常”操作中,JVM从所谓的“主线程”调用main
,但不能保证这就是调用main
方法的方式。它可能被EDT上下文中的另一个类调用,这将导致程序冻结
通常,您应该使用一个
javax.swing.Timer
或一个单独的线程
public void paint(Graphics g){
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
bird.paint(g2D);
}
您正在重写paint
,不建议这样做,建议您改为重写paintComponent
另一个问题是
Toolkit.getDefaultToolkit().getImage("bird.jpeg");
问题是getImage(St