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