Java 未在JPanel.paintComponent中绘制图像
我实际上想加载图像,但只有小程序对话框打开,没有发生错误,但图像没有加载。代码如下Java 未在JPanel.paintComponent中绘制图像,java,image,swing,jpanel,paintcomponent,Java,Image,Swing,Jpanel,Paintcomponent,我实际上想加载图像,但只有小程序对话框打开,没有发生错误,但图像没有加载。代码如下 import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JPanel; public class Ball extends JPanel{ Image image; public Ball(){ super(
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ball extends JPanel{
Image image;
public Ball(){
super();
image = Toolkit.getDefaultToolkit().getImage("/D:\\lolololo\\tuto\\bin\\sa.jpg");
}
private Image getResource(String string) {
return image;
// TODO Auto-generated method stub
}
public void paintComponent(Graphics g){
// Draw our Image object.
g.drawImage(image,50,10,574,960, this); // at location 50,10
// 200 wide and high
}
public void main(String arg[]){
JFrame frame = new JFrame("ShowImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800,500);
Ball panel = new Ball();
frame.setContentPane(panel);
frame.setVisible(true);
}
}
加载图像的方式是错误的。当您提取为可运行jar时,这将永远不起作用
- 在src内创建包(“res”)
image = ImageIO.read(Ball.class.getResource("/res/sa.jpg"));
这会奏效的
正如Andrew在评论中指出的,主要类应该是
public static void main(String arg[]) {}
+1至@Andrewthompson评论 1) 下面是不正确的,您没有通过调用
super.paintComponent(…)
的super实现来优化绘制链:
:
此外,如果您不调用super的实现,则必须遵守
不透明属性,即如果此组件不透明,则必须
以非不透明的颜色完全填充背景。如果你不
尊重不透明属性,您可能会看到视觉瑕疵
应该是:
public class Ball extends JPanel {
BufferedImage image;
public Ball() {
super();
try {
image=ImageIO.read(new File("c:/test.jpg"));//change to your path of file
}catch(Exception ex) {//file did not load properly
ex.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
// Draw our Image object.
g.drawImage(image,0,0,image.getWidth(),image.getHeight(), this); // at location 50,10
// 200 wide and high
}
@Override
public Dimension getPreferredSize() {
return new Dimension(image.getWidth(),image.getHeight());//replace with size of image
}
}
另请注意:
- 我覆盖了
的JPanel
,并返回了我想要的getPreferredSize()
s(即图像大小),或者Dimension
将只与添加到其中的组件一样大,而不是图像(因此如果没有组件0,0)JPanel
- 我还选择了
vsBufferedImage
,并用try-catch来检查是否抛出了任何错误Image
- 我看到你也有
为什么是50和10而不是0,0g.drawImage(图像,50,10…
image=Toolkit.getDefaultToolkit().getImage(“/D:\\lolololo\\tuto\\bin\\sa.jpg”)代码>
不需要/that仅当它位于您的类包中时,而不是当它位于您的硬盘上的设置位置时
3) 正如@AndrewThompson所说,主要方法应该是:
public class Ball extends JPanel {
BufferedImage image;
public Ball() {
super();
try {
image=ImageIO.read(new File("c:/test.jpg"));//change to your path of file
}catch(Exception ex) {//file did not load properly
ex.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
// Draw our Image object.
g.drawImage(image,0,0,image.getWidth(),image.getHeight(), this); // at location 50,10
// 200 wide and high
}
@Override
public Dimension getPreferredSize() {
return new Dimension(image.getWidth(),image.getHeight());//replace with size of image
}
}
publicstaticvoidmain(String[]args){}
请注意,静态修改器以另一种方式应用,它只是另一种方法
4) 也不要使用JFrame#setSize(..)
,而是使用LayoutManager
和/或覆盖getPreferredSize
,而不是在JFrame
实例上调用pack()
,然后将其设置为可见
5) 另外,请仔细阅读。尤其是“/D:\\lolololo\\tuto\\bin\\sa.jpg”
不应包含前导的/
。它应该是“D:\\lolololo\\tuto\\bin\\sa.jpg”
假定该路径的其余部分是正确的。作为一个无效的public void main(字符串arg[]){
不是main方法的有效方法签名!给定Toolkit.getImage(字符串)
在找不到图像时不会抛出任何错误,我更喜欢使用ImageIO
加载它们。当出现任何错误时,它提供了许多有用的输出。另请参阅显示许多绘图图像示例的答案