我相信你要做的是调用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)方法可能会更好.抱歉胡扯,我希望这会有所帮助.