在JFrame中绘制矩形不起作用

时间:2014-03-14 10:17:29

标签: 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 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);
    }
}

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

4 个答案:

答案 0 :(得分:2)

您已设法通过调用:

完全打破了油漆链
m.paint(null); 

应该是:

m.repaint();

调用repaint()后,paint(Graphics)方法将自动调用,但带有有效图形对象。

请注意,覆盖添加到paintComponent(Graphics)(或窗口,applet或对话框)的JPanel的{​​{1}}方法通常被认为更好。 )。

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

答案 1 :(得分:2)

我相信您要做的就是致电frame.repaint();。但是,这仍然不能解决您的问题,因为您的paint()方法实际上并未覆盖JFrame的{​​{1}}方法,因为您的类没有扩展paint(),它只是在构造函数中创建JFrame

所以,你可以 做最后一分钟覆盖并将你的绘画方法移动到那里(根据polypiel的答案),或者(我个人认为更有说服力)你可以让你的类扩展JFrame,像这样;

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方法可能会更好。抱歉胡扯,我希望这会有所帮助。

答案 2 :(得分:1)

应该覆盖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
    }
}

答案 3 :(得分:0)

不要在外部调用绘图并在paint()方法中调用super.paint。

public void paint(Graphics g)
{
 super.paint(g);
//....

}

并删除m.paint(null)。