Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaJFrame中放置图像_Java_Swing_Jframe_Jpanel_Draw - Fatal编程技术网

在JavaJFrame中放置图像

在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

我已经尝试了一段时间,试图将一个图像加载到这个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.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