为什么 paintComponent 不起作用?

Why paintComponent doesn't work?

我在使用这段代码时遇到问题。出于某种原因,paintComponent(Graphics g) 根本不起作用,而且似乎没有如何强制它的答案。这是我的代码:

import javax.swing.JFrame;

public class Robotron extends JFrame
{

    public Robotron ()
    {
        //add(this); This one gave me an error
        setSize(800, 600);
        new TestFrame();
        setVisible(true);
    }


    public static void main(String [ ] args)
    {

        new Robotron();

    }

这是我的 TestFrame class,它具有 paintComponent 功能:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;


public class TestFrame extends JPanel
{
     public void paintComponent(Graphics g) 
    {
         g.setColor(Color.BLACK);
         g.fillRect(0, 0, getWidth(), getHeight());
         g.setColor(Color.YELLOW);
         g.fillRect(100, 100, 10, 30);
         System.out.println("Abdullah Paint");

     }


    public TestFrame()
    {
        setFocusable(true);        
        repaint();        

    }


}

我该怎么做才能让 paintComponent 真正发挥作用。我最后得到的只是一个空的 JFrame,没有 运行 的 System.out.println 东西。

非常感谢,解决这个问题很久了。

您需要将面板添加到框架中:

public Robotron ()
{
    //add(this); This one gave me an error
    setSize(800, 600);
    add(new TestFrame());
    setVisible(true);
}

您没有向 JFrame 添加任何内容,因此

//add(this); 

在这里,您试图将组件添加到自身,但它不会飞。

相反,您需要将 TestFrame 实例添加到框架中。

    add(new TestFrame());
    setSize(800, 600);
    setVisible(true);

正如其他人所说,您需要将面板添加到框架中:

public Robotron() {

    add(new TestFrame());
    setSize(800, 600);
    setVisible(true);
}

正如其他人所提到的 not,您需要在覆盖的方法中调用 super.paintComponent(g) 第一件事:

@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.YELLOW);
    g.fillRect(100, 100, 10, 30);
    System.out.println("Abdullah Paint");
}

备注:

  • 不要在构造函数中调用 repaint()。充其量它什么都不做。
  • 不要为框架调用 setSize(...),而是调用 pack()。为此,您需要覆盖面板中的 getPreferredSize 方法。