我有一些应该在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);
}
}
有人可以告诉我为什么它不能正常工作吗?
我相信您要去打电话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)
那里的方法可能会更好。对不起,我希望这对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句