Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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
Java Can';无法获取要显示的图像图标_Java_Swing_Graphics_Jframe_Imageicon - Fatal编程技术网

Java Can';无法获取要显示的图像图标

Java Can';无法获取要显示的图像图标,java,swing,graphics,jframe,imageicon,Java,Swing,Graphics,Jframe,Imageicon,我看了很多其他的问题,其中人们的问题与我这里遇到的问题类似(大多数解决方案都是通过简单的错误找到的),但我一辈子都不明白为什么我的图形不会显示在我的jframe中。我对Java图形非常陌生,因此我非常感谢能得到的所有帮助。(如果有人认为这是一个重复的问题,我只要求你等到我得到答案后再关闭) 哦,还有,当我运行程序时,它告诉我调用了repaint方法,如果这在某种程度上有帮助的话 package game.try5; import java.awt.Dimension; import java.

我看了很多其他的问题,其中人们的问题与我这里遇到的问题类似(大多数解决方案都是通过简单的错误找到的),但我一辈子都不明白为什么我的图形不会显示在我的jframe中。我对Java图形非常陌生,因此我非常感谢能得到的所有帮助。(如果有人认为这是一个重复的问题,我只要求你等到我得到答案后再关闭)

哦,还有,当我运行程序时,它告诉我调用了repaint方法,如果这在某种程度上有帮助的话

package game.try5;

import java.awt.Dimension;
import java.net.URL;

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

public class Window {

    public Window() {
        JFrame frame = new JFrame("Epic Game");
        frame.setSize(800,600);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        GamePanel panel = new GamePanel();
        frame.add(panel);

        frame.setVisible(true);
    }

    public static void main(String[] args){
        Window window = new Window();
    }
}   


注释掉
frame.setLayout(null)
  • JFrame
    的默认布局当前是
    BorderLayout
  • 添加到无约束的
    边界布局
    的对象默认为
    中心
  • BorderLayout
    中心
    中的对象将拉伸到可用的宽度和高度
  • 因为代码调用
    frame.setSize(800600)可用宽度和高度为800x600像素,小于框架装饰

  • 更好的全面方法是:

  • 让自定义绘制的组件覆盖
    getPreferredSize()
    以返回合理的值
  • 将组件添加到容器中
  • 最后,打包顶层窗口。这将使框架成为显示内容所需的最小尺寸

  • 1) 您已经复制了两次
    窗口
    ,但没有
    游戏对象
    。2) Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。3) 注释掉
    frame.setLayout(null)Frame
    (可能
    JFrame
    -不太记得了)它过去是
    FlowLayout
    ,但现在是
    BorderLayout
    。对于
    JPanel
    而言,它是一个
    FlowLayout
    。我真的不喜欢依赖任何“默认”布局,因为Sun/Oracle很少在Java文档中声明这些布局,因此它们应该被视为“开放更改”。
    package game.try5;
    
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    
    public class GamePanel extends JPanel{
        GameObject go = new GameObject(0,0,false,"Dog.jpg");
    
        public GamePanel(){
            repaint();
            System.out.println("Repaint method called");
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(go.getImg().getImage(), go.getxLoc(), go.getyLoc(), 50, 50, null);
            System.out.println("Graphics method called");
        }
    }
    
    package game.try5;
    
    import java.awt.Dimension;
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class Window {
    
        public Window() {
            JFrame frame = new JFrame("Epic Game");
            frame.setSize(800,600);
            frame.setLocationRelativeTo(null);
            frame.setLayout(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            GamePanel panel = new GamePanel();
            frame.add(panel);
    
            frame.setVisible(true);
        }
    
        public static void main(String[] args){
            Window window = new Window();
        }
    }