【问题标题】:Drawing on JPanel doesn't do anything在 JPanel 上绘图没有任何作用
【发布时间】:2014-06-14 13:25:35
【问题描述】:

我已经为此苦苦挣扎了几个小时。我做了一周的 2D 游戏,遇到了一个让我发疯的问题(可能只是我自己)!当我插入图像时,它不显示。当我尝试绘制一个矩形时,它不显示。这是我的代码:

import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

//import java.awt.Image;
//import javax.swing.ImageIcon;

public class SpaceInvaders {
    // variables
    static Board table;

    public static void main(String[] args) {
        createGui();
    }

    static void createGui(){
         JFrame frame = new JFrame("Spane Invaders UK");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().setPreferredSize(new Dimension(1000, 600));

         table = new Board();
         frame.add(table);

         frame.pack();
         frame.setVisible(true);
    }

}

class Board extends JPanel{

    //Image tank;

    public Board(){
        //ImageIcon ii = new ImageIcon(this.getClass().getResource("tank.png"));
        //tank = ii.getImage();
    }

    public void painComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        //g2d.drawImage(tank, 10, 10, null);
        g2d.drawRect(50, 50, 10, 10);
    }
}

可能有一个简单的解决方案,实际上非常简单,以至于在 Google 上找不到。尽管如此,我还是被困住了。为什么什么都没有发生?我该如何解决这个问题?

我注释掉了“图像”代码,因为这不是问题。

随意编辑。

【问题讨论】:

  • 如果调整框架大小会发生什么?它有什么改变吗?不会自动触发重绘。
  • @aRestless ,你的意思是像在 frame.setVisible(true) 之后调用 board.repaint() 吗?这不会改变任何事情。

标签: java swing jpanel paintcomponent graphics2d


【解决方案1】:

除非这里写代码时打错了,否则你的方法名是错误的:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    //g2d.drawImage(tank, 10, 10, null);
    g2d.drawRect(50, 50, 10, 10);
}

注意:正如另一个答案中提到的,使用 @Override 注释您会立即注意到这个错误。

【讨论】:

    【解决方案2】:

    这是一个错字。

    public void painComponent(Graphics g){
    

    始终使用@Override 注释来避免这些错误。

    【讨论】:

    • @Wolfdog 尝试改变您的方法,以便您可以更快地发现这些愚蠢的错误。例如,您可以使用@Override annotation。此外,您应该尝试在“painComponent”中添加println("I'm here"),然后您很容易诊断出问题在于执行从未通过该代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多