下面是JDK文档对这个方法的说明,看不明白,麻烦解释一下:
另外,如果不调用超类的实现,[color=#FF0000]则必须遵守不透明属性,也就是如果此组件是不透明的,则必须以透明的颜色完全填充背景。如果不遵守不透明属性,则很可能看到可视化的人为内容。 [/color]
super.paintComponent和组件的背景有什么联系?

解决方案 »

  1.   

        /**
         * Calls the UI delegate's paint method, if the UI delegate
         * is non-<code>null</code>.  We pass the delegate a copy of the
         * <code>Graphics</code> object to protect the rest of the
         * paint code from irrevocable changes
         * (for example, <code>Graphics.translate</code>).
         * <p>
         * If you override this in a subclass you should not make permanent
         * changes to the passed in <code>Graphics</code>. For example, you
         * should not alter the clip <code>Rectangle</code> or modify the
         * transform. If you need to do these operations you may find it
         * easier to create a new <code>Graphics</code> from the passed in
         * <code>Graphics</code> and manipulate it. Further, if you do not
         * invoker super's implementation you must honor the opaque property,
         * that is
         * if this component is opaque, you must completely fill in the background
         * in a non-opaque color. If you do not honor the opaque property you
         * will likely see visual artifacts.
         * <p>
         * The passed in <code>Graphics</code> object might
         * have a transform other than the identify transform
         * installed on it.  In this case, you might get
         * unexpected results if you cumulatively apply
         * another transform.
         *
         * @param g the <code>Graphics</code> object to protect
         * @see #paint
         * @see ComponentUI
         */
        protected void paintComponent(Graphics g) {
            if (ui != null) {
                Graphics scratchGraphics = (g == null) ? null : g.create();
                try {
                    ui.update(scratchGraphics, this);
                }
                finally {
                    scratchGraphics.dispose();
                }
            }
        }    /**
         * Notifies this UI delegate that it's time to paint the specified
         * component.  This method is invoked by <code>JComponent</code> 
         * when the specified component is being painted. 
         * By default this method will fill the specified component with
         * its background color (if its <code>opaque</code> property is
         * <code>true</code>) and then immediately call <code>paint</code>.
         * In general this method need not be overridden by subclasses;
         * all look-and-feel rendering code should reside in the <code>paint</code>
         * method.
         *
         * @param g the <code>Graphics</code> context in which to paint
         * @param c the component being painted;
         *          this argument is often ignored,
         *          but might be used if the UI object is stateless
         *          and shared by multiple components
         * 
         * @see #paint
         * @see javax.swing.JComponent#paintComponent
         */ 
        public void update(Graphics g, JComponent c) {
    if (c.isOpaque()) {
        g.setColor(c.getBackground());
        g.fillRect(0, 0, c.getWidth(),c.getHeight());
    }
    paint(g, c);
        }