解决方案 »

  1.   

    因为你没有重写paint这个function,repaint()会调用 这个function再画
      

  2.   

    我试了正常啊,你说的重新显示是什么意思?不过你这代码有两个问题,第一,添加组件最好在窗体初始化的时候就添加,而且只需要添加一次
    你在paint里面new一个Button然后添加,那么就相当于窗体每绘制一次你就去添加一个Button,而原来的Button其实还在,导致的结果就是随便运行一会儿,窗体上可能就有几百上千个Button了,而实际上你本意不是这样第二你在paint里面两次getColor,但又没用到,不知道你是之前有用到后来删掉了部分代码还是怎么回事
      

  3.   

    这样改
    class PaintFrame extends Frame {
    @Override
    public void paint(Graphics g) {
    g.setColor(new Color(10, 100, 30));
    g.fillOval(30, 40, 50, 60);
    g.setColor(Color.GREEN);
    g.fillRect(80, 80, 40, 40);
    }

    public PaintFrame() {
    this.setBounds(200, 200, 500, 500);
    this.setLayout(null);

    Button b = new Button("Hello");
    this.add(b);
    b.setBounds(300, 300, 50, 30);

    this.setVisible(true);
    }
    }
      

  4.   

    因为你没有把layout设为绝对位置,即this.setLayout(null);
    而Frame的默认layout是BorderLayout,那么你添加一个按钮,这个按钮就会占据整个窗体,所以那一大片灰色的实际上都是那个按钮而在你最小化之前正常只是巧合,因为layout管理器只会在窗体加载和重新调整大小的时候才会重新排布组件,所以你在paint方法里添加Button,这个时候窗体已经加载好,所以你添加一个Button,layout管理器并不会马上对其进行排布,而当你最小化的时候,(实际上凡是能改变窗体大小的操作都可以),layout管理器进行重排,于是让按钮占据了整个窗体