我有一段代码应该在 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
。
因此,您可以要么做最后一分钟的重写并将您的绘画方法移到其中(根据 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)
方法。对不起,我胡说八道,希望这对您有所帮助。
关于java - 在 JFrame 中绘制矩形不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402131/