Java图形问题

5
我是一个Java初学者,我的第一个项目是建立一个大富翁游戏。我正在使用Graphics方法在SWING中构建GUI。
出现了两个问题,我找不到答案。第一个问题是,似乎我不能将背景颜色设置为我的JPanel,而我之前在同一项目的另一个JPanel中用相同的方式做过。
第二个问题是,当我尝试添加图片时,我收到一个NullPointerException。我用try / catch解决了这个错误,但是似乎Graphics没有绘制。同样,我之前在另一个JPanel中使用相同的方法加载和添加图像,并且它可以工作。
我应该提到,我的JFrame目前包含3个元素,在不同的类中分别添加并通过BorderLayout()进行添加。
这是出问题的类的代码:
    public class MonopolyBoard extends JPanel{


    Image atlantic;
    MonopolyBoard() {
        this.setBorder(new EtchedBorder());

        this.setBackground(new Color( (80), (180), (210) )); //this code dosent work

        //this throws exception without try catch
        try{
        ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg"));
         atlantic = a.getImage();
       }
       catch(NullPointerException e){}
       }

    public void paint(Graphics g){

          }
          Graphics2D g2 = (Graphics2D) g; 
         //this code should draw the image but it dosent
          g2.drawImage(atlantic, 100, 100, null);
          g.drawImage(atlantic, 100, 100, this);

    };
}

不要在那里使用 try/catch。发布堆栈跟踪。 - Bhesh Gurung
4
SwingзЁӢеәҸеә”иҜҘиҰҶзӣ–paintComponent()ж–№жі•иҖҢдёҚжҳҜиҰҶзӣ–paint()ж–№жі•гҖӮвҖ”вҖ”жқҘиҮӘAWTе’ҢSwingдёӯзҡ„з»ҳеҲ¶пјҡз»ҳеҲ¶ж–№жі•гҖӮ - trashgod
好的,那我不知道为什么会抛出异常。我之前通过构造函数在JPanel中添加了图像,但这种情况并没有发生。 - user1146440
@user1146440,您是想在这个JPanel中添加另一个JComponents,还是只想绘制背景并将图像放置在那里? - mKorbel
好的,很有可能 this.getClass().getResource("../Card/Atlantic Ave.jpg") 调用会导致错误。您能否使用 catch(Exception e) 捕获它,然后执行 e.printStackTrace(); 并让团队知道吗? - ring bearer
显示剩余2条评论
3个回答

1

我对你的代码感到非常困惑,但我认为问题在于你的面板没有绘制!你的绘制方法应该是:

@Override
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent
     g2.drawImage(atlantic, 100, 100, null);
     g.drawImage(atlantic, 100, 100, this);
}

你使用 Eclipse 吗?如果没有,你应该用,它会减少你遇到的很多问题 :) 玩得开心! - Sam Palmer
我使用Netbeans,我的错误在于它没有绘制图像,因为它不在正确的包中,这就是为什么我会得到异常的原因,现在我唯一的问题是JPanel的背景设置不正确。 - user1146440
我能看到的唯一原因就是我所发布的答案,即在你的绘制方法中没有被调用任何内容。上面的答案应该有效。 - Sam Palmer
还有一个可能以后会用到的有用提示。如果面板等更新它们的图形,请在父容器上使用invalidate()。这将通过调用paintComponent方法重新绘制所有子元素。 - Sam Palmer

1
除非你在catch块中打印堆栈跟踪,否则你不会知道发生了什么。如果构造函数new ImageIcon()没有抛出异常,而是返回了一个空对象,那么下一行a.getImage()肯定会导致NPE,因为你不能在空对象上调用方法。
与其这样做,
 //this throws exception without try catch         
 try
 {           
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));
     atlantic = a.getImage();        
 }        
 catch(NullPointerException e){}   

尝试一下。
// the next line may be wrapped incorrectly due to MarkDown
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));
if (a == null)
{
    System.out.println("Can not find AtlanticAve.jpg");
    return;
}
     atlantic = a.getImage();        

这行代码

 // the next line may be wrapped incorrectly due to MarkDown
 ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));

基本上,你需要先看看是什么可能导致 ImageIcon 构造函数返回一个空对象。这会让你朝正确的方向前进。可能是由于 getResource() 调用失败导致的问题。一个简单的方法是将上述代码分解,并为每个部分设置单独的结果变量。虽然这样做有些凌乱和低效,但有时故障排除就是这样进行的。
// using _var_ because I'm too lazy to look up the return types of the methods
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg");
if (x1 == null)
{
   System.out.println("Can't find my resource");
}

你明白了


我已经成功解决了图像问题,似乎我没有将图像放在正确的包中,现在我唯一的问题是为什么背景没有设置? - user1146440

1

设置背景颜色没有任何效果,因为您覆盖了paint()方法。Paint方法负责绘制背景。

您需要在自己的paint方法中绘制背景:

public void paint(Graphics g){
    // paint the background
    g.fill(); // not sure about the parameters
    // paint your image
    g.drawImage(...);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接