不是用Java绘制的形状

不是用Java绘制的形状,java,swing,jframe,Java,Swing,Jframe,谁能帮我一下,告诉我为什么矩形不会出现?框架运行良好,但未显示任何形状。我尝试了几种不同的方法,包括使用两个单独的类,但是我得到的只是一个空框架 import java.awt.Color; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Surface extends JPanel { public void paintComponent(

谁能帮我一下,告诉我为什么矩形不会出现?框架运行良好,但未显示任何形状。我尝试了几种不同的方法,包括使用两个单独的类,但是我得到的只是一个空框架

import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Surface extends JPanel 
{

    public void paintComponent(Graphics2D g)
    {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.drawRect(100, 100, 30, 40);
    }

    public static void main(String[] args) 
    {
        Surface s = new Surface();
        JFrame jf = new JFrame();
        jf.setTitle("Tutorial");
        jf.setSize(600, 400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(s);
        s.repaint();
    }
}

如果要重写某个方法,请正确地对其进行注释:

@Override
public void paintComponent(Graphics2D g)
{
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.drawRect(100, 100, 30, 40);
}
然后IDE应该告诉您,您没有正确重写
paintComponent
方法,因为您的参数类型
Graphics2D
是错误的

这是in
JComponent
中组件的签名:

如您所见,它使用
图形
而不是
图形2d
。您当前使用的是
paintcomponent
,而不是它。因此,将参数类型更改为
Graphics
(并导入
java.awt.Graphics
)即可:

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.drawRect(100, 100, 30, 40);
}
顺便说一句,您首先要设置
jf
的可见性,然后向其内容窗格添加内容。在某些情况下,这可能会导致问题,并且添加的组件在重新绘制帧(或执行其他操作,导致帧重新绘制自身,如调用
pack()
)之前将不可见。因此,最好在
main
方法中切换这些方法调用的顺序:

Surface s = new Surface();
JFrame jf = new JFrame();
jf.setTitle("Tutorial");
jf.setSize(600, 400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(s);
//s.repaint(); // not needed anymore, because "jf" will repaint everything during the 'setVisible' call
jf.setVisible(true); // should almost always be the last thing you do

谢谢你的帮助,谢谢。但是,我对我的代码做了这些更改,但仍然不起作用。@Santi请确保您使用
java.awt.Graphics
作为参数类型,而不是任何其他
Graphics
版本。这就是现在的样子:@Santi如果我运行该代码,那么我可以看到红色矩形:这很奇怪,我的eclipse可能有问题?
Surface s = new Surface();
JFrame jf = new JFrame();
jf.setTitle("Tutorial");
jf.setSize(600, 400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(s);
//s.repaint(); // not needed anymore, because "jf" will repaint everything during the 'setVisible' call
jf.setVisible(true); // should almost always be the last thing you do