【问题标题】:JPanel not painting, JFrame remains blankJPanel 不绘画,JFrame 保持空白
【发布时间】:2021-10-23 06:27:47
【问题描述】:

我正在开发一款类似 Pokemon 卡片的数字游戏。当我尝试绘制任何图像时,JFrame 仍然为空。这可能是一个简单的错误,但我一直无法找到解决方案。在 Stack Overflow 上,我看到了很多类似我的问题,尽管他们的解决方案不适用于我的代码。这是代码: JFrame 的类:

import javax.swing.JFrame;


public class Rocks extends JFrame{

public Rocks(){
    setVisible(true);
    setTitle("Rocks Card Game");
    setSize(1200,297);
    add(new Display());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
    new Rocks();
}

}

JPanel 类:

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;


public class Display extends JPanel{
    Image granite;
    public Display(){
        granite = new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png").getImage();
        setBackground(Color.black);
    }
    public void paint(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(granite,0,0,null);
    }
}

【问题讨论】:

  • 不需要自定义绘画。只需使用带有图标的 JLabel。
  • 很高兴你把它整理好了。 :)

标签: java swing awt paint event-dispatch-thread


【解决方案1】:

有没有理由扩展JFrame 如果你没有它,就不要。它比继承更可取。正如@camickr 所说,不需要自定义绘画,您可以使用JLabel 并致电setIcon

public class Rocks{

private JFrame frame;

public Rocks(){
    frame = new JFrame();
    frame.setTitle("Rocks Card Game");
    frame.setSize(1200,297);
    //frame.add(new Display());
    //as camickr comment
    JLabel label = new JLabel(new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png"));
    frame.add(label);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack(); // size components
    frame.setVisible(true); // make it visible
}
public static void main(String[] args) {
    new Rocks();
}

}

另外你必须看看 Swing 程序是否应该覆盖paintComponent() 而不是覆盖paint()

所以(如果您仍然想使用面板)像这样更改您的面板类

public class Display extends JPanel{
    Image granite;
    public Display(){
        granite = new ImageIcon("C:\\Users\\Raj\\Pictures\\Granite.png").getImage();
        setBackground(Color.black);
    }
    @Override // always add override annotation
    public void paintComponent(Graphics g){
        super.paintComponent(g); // always call super first
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(granite,0,0,this);
    }
}

阅读更多:Painting in AWT and Swing components

【讨论】:

  • “组合优于继承。” +1 其余的也很好,但你在第一段有我。 :)
  • 好的,我会的。谢谢。
【解决方案2】:

setVisible(true); 移动到 Rocks 构造函数的底部。

编辑: Explanation on why setVisible() should be called last

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多