JPanel drawingArea = new JPanel() {
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);                Rectangle rect;
                for (int i = 0; i < objects.size(); i++) {
                    rect = (Rectangle)objects.elementAt(i);
                    g.setColor(colors[(i % color_n)]);
                    g.fillOval(rect.x, rect.y, rect.width, rect.height);
                }
            }
        };这是不是匿名内部类??当调用方法drawingArea.repaint()时,自动调用此内部的方法吧?这样写比直接写成public void paintComponent(Graphics g)有什么好处?还有为什么要写成protected形式?

解决方案 »

  1.   

    相当于class MyPanel extends JPanel {
      /** @Override */
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Rectangle rect;
        for (int i = 0; i < objects.size(); i++) {
        .....
      }
    }....
    JPanel drawingArea = new MyPanel();
      

  2.   

    直接写public void paintComponent(Graphics g),覆盖的是你外面那个控件的(e.g. JFrame)的paint,而它的目的就是只改局部的这个panel
      

  3.   

    奥,这样是因为java的单继承.因为整个程序已经继承了JPanel类,如果直接写成这样的形式,就会覆盖外面的paint方法。
        谢谢您了!