Java 在JFrame中绘制矩形不工作

Java 在JFrame中绘制矩形不工作,java,swing,jframe,Java,Swing,Jframe,我有一段代码,应该在JFrame上画一个矩形,但是当我在Eclipse上运行程序时,它只是打开了框架,但没有在上面画圆 代码如下: import javax.swing.*; import java.awt.*; public class Infout { Infout(){ JFrame frame = new JFrame(); frame.setSize(300, 400); frame.setTitle("An Empty Fr

我有一段代码,应该在
JFrame
上画一个矩形,但是当我在Eclipse上运行程序时,它只是打开了框架,但没有在上面画圆

代码如下:

import javax.swing.*;
import java.awt.*;

public class Infout {
    Infout(){
        JFrame frame = new JFrame();

        frame.setSize(300, 400);
        frame.setTitle("An Empty Frame");
        frame.setDefaultCloseOperation(3);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
         // TODO Auto-generated method stub
         Infout m = new Infout();
         m.paint(null); 
    }

    public void paint(Graphics g) 
    {
         g.drawRect(5, 5, 105, 105);
    }
}

有人能告诉我为什么它不能正常工作吗

通过调用以下命令,您已经成功地完全打破了绘制链:

m.paint(null); 
应该是:

m.repaint();
调用
repaint()
,将自动调用
paint(Graphics)
方法,但使用有效的图形对象

请注意,通常认为最好覆盖添加到
JFrame
(或窗口、小程序或对话框…)的
JPanel
paintComponent(Graphics)
方法


重写任一方法时要做的事情是在执行任何其他操作之前调用super方法。

我相信您要做的是调用
frame.repaint()取而代之。但是,这仍然不能解决您的问题,因为您的
paint()
方法实际上并没有覆盖
JFrame
paint()
方法,因为您的类没有扩展
JFrame
,它只是在构造函数中创建一个
JFrame

因此,您可以在最后一分钟进行重写,并将您的paint方法移动到其中(根据polypiel的回答),或者(我个人认为更有说服力)您可以让您的类扩展JFrame,如下所示

import javax.swing.*;
import java.awt.*;

public class Infout extends JFrame{
    Infout(){
        setSize(300, 400);
        setTitle("An Empty Frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
         Infout m = new Infout();
         m.repaint(); 
    }

    @Override
    public void paint(Graphics g) 
    {
         g.drawRect(5, 5, 105, 105);
    }

}
然而,正如其他人指出的那样,
paintComponent()
是更好的重写选择,您应该记住在新的重写方法开始时对
super()
进行适当的调用。然后,您必须创建一个新的
JPanel
以放入
JFrame
中,因为
JFrame
没有要覆盖的
paintComponent()
方法

为此,您可以从类中完全删除
paint()
方法,并在构造函数中添加以下最后一分钟重写:

    setLayout(new BorderLayout());
    add(new JPanel(){
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(5, 5, 105, 105);
        }
    }, BorderLayout.CENTER);

但是,为了实现可扩展性和良好的面向对象设计,从长远来看,您最好定义自己的
JPanel
子类,并覆盖
paintComponent(Graphics)
方法。很抱歉,我希望这会有所帮助。

不要在外部调用paint,而是在paint()方法中调用super.paint


并删除m.paint(null)。

应该覆盖
JFrame的paint方法。
Infout
中的绘制方法无效

import javax.swing.*;
import java.awt.*;

public class Infout {
    Infout(){
        JFrame frame = new JFrame() {
          @Override public void paint(Graphics g) {
            g.drawRect(5, 5, 105, 105);
          }
        };

        frame.setSize(300, 400);
        frame.setTitle("An Empty Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
         // TODO Auto-generated method stub
         Infout m = new Infout();
         // You shouldn't need to call repaint
    }
}

在哪里调用paint方法[参考此链接]+1,以便使用有效的SSCCE发布您的问题。“
frame.setDefaultCloseOperation(3);
”当存在定义的常量时,不要使用幻数。这就是@Override注释有用的原因自定义绘制需要在
paintComponent()中执行
JComponent的
调用
super()
方法。需要在
JComponent的
调用
super()
方法的
paintComponent()
中执行自定义绘制。@alex2410-一次解决一个问题,他们需要了解自己做错了什么,以及当前代码为什么不工作。我将编辑我的答案,以表明paintComponent()是一个更好的替代选择。如果OP没有询问这一点,您需要建议他使用更好的方法来避免将来出现问题。添加一个paintComponent示例,我将给您投票。@alex2410-适当的
paintComponent(图形)代码示例
added:)需要在
JComponent
paintComponent()
中通过调用
super()
方法执行自定义绘制。
import javax.swing.*;
import java.awt.*;

public class Infout {
    Infout(){
        JFrame frame = new JFrame() {
          @Override public void paint(Graphics g) {
            g.drawRect(5, 5, 105, 105);
          }
        };

        frame.setSize(300, 400);
        frame.setTitle("An Empty Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
         // TODO Auto-generated method stub
         Infout m = new Infout();
         // You shouldn't need to call repaint
    }
}