JFrame中的绘制矩形不起作用

阿布圣丹

我有一些应该在a上绘制矩形的代码,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);
    }
}

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

鲁迪·克肖(Rudi Kershaw)

我相信您要去打电话frame.repaint();然而,这仍然不排序您的问题,因为你的paint()方法实际上不是重写JFramepaint()方法,因为你的类不延长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)那里方法可能会更好对不起,我希望这对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章