我相信你想做的是打电话frame.repaint();
反而。但这仍然不能解决你的问题,因为你的paint()
方法实际上并没有覆盖JFrame
's paint()
方法,因为你的类没有扩展JFrame
,它只是创建一个JFrame
在构造函数中。
所以你可以either做最后一分钟的覆盖并将你的绘制方法移动到其中(根据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)
方法那里。抱歉胡言乱语,希望这会有所帮助。