javax.swing.Painter源码实例Demo

类javax.swing.Painter源码实例Demo

下面列出了javax.swing.Painter 类实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码2 项目: dragonwell8_jdk   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码3 项目: hottub   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码4 项目: TencentKona-8   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码5 项目: jdk8u60   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码6 项目: JDKSourceCode1.8   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码7 项目: openjdk-jdk8u   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码8 项目: openjdk-8-source   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码9 项目: Bytecoder   文件: SynthPainterImpl.java
private void paintBackground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    // if the background color of the component is 100% transparent
    // then we should not paint any background graphics. This is a solution
    // for there being no way of turning off Nimbus background painting as
    // basic components are all non-opaque by default.
    Component c = ctx.getComponent();
    Color bg = (c != null) ? c.getBackground() : null;
    if (bg == null || bg.getAlpha() > 0){

        Painter<Object> backgroundPainter = style.getBackgroundPainter(ctx);
        if (backgroundPainter != null) {
            paint(backgroundPainter, ctx, g, x, y, w, h,transform);
        }
    }
}
 
源代码10 项目: Bytecoder   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    @SuppressWarnings("unchecked")
    Painter<JComponent> painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码11 项目: Bytecoder   文件: NimbusStyle.java
/**
 * Gets the appropriate background Painter, if there is one, for the state
 * specified in the given SynthContext. This method does appropriate
 * fallback searching, as described in #get.
 *
 * @param ctx The SynthContext. Must not be null.
 * @return The background painter associated for the given state, or null if
 * none could be found.
 */
public Painter<Object> getBackgroundPainter(SynthContext ctx) {
    Values v = getValues(ctx);
    int xstate = getExtendedState(ctx, v);
    Painter<Object> p = null;

    // check the cache
    tmpKey.init("backgroundPainter$$instance", xstate);
    p = paintFilter((Painter)v.cache.get(tmpKey));
    if (p != null) return p;

    // not in cache, so lookup and store in cache
    RuntimeState s = null;
    int[] lastIndex = new int[] {-1};
    while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
        if (s.backgroundPainter != null) {
            p = paintFilter(s.backgroundPainter);
            break;
        }
    }
    if (p == null) p = paintFilter((Painter)get(ctx, "backgroundPainter"));
    if (p != null) {
        v.cache.put(new CacheKey("backgroundPainter$$instance", xstate), p);
    }
    return p;
}
 
源代码12 项目: Bytecoder   文件: NimbusStyle.java
/**
 * Gets the appropriate foreground Painter, if there is one, for the state
 * specified in the given SynthContext. This method does appropriate
 * fallback searching, as described in #get.
 *
 * @param ctx The SynthContext. Must not be null.
 * @return The foreground painter associated for the given state, or null if
 * none could be found.
 */
public Painter<Object> getForegroundPainter(SynthContext ctx) {
    Values v = getValues(ctx);
    int xstate = getExtendedState(ctx, v);
    Painter<Object> p = null;

    // check the cache
    tmpKey.init("foregroundPainter$$instance", xstate);
    p = paintFilter((Painter)v.cache.get(tmpKey));
    if (p != null) return p;

    // not in cache, so lookup and store in cache
    RuntimeState s = null;
    int[] lastIndex = new int[] {-1};
    while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
        if (s.foregroundPainter != null) {
            p = paintFilter(s.foregroundPainter);
            break;
        }
    }
    if (p == null) p = paintFilter((Painter)get(ctx, "foregroundPainter"));
    if (p != null) {
        v.cache.put(new CacheKey("foregroundPainter$$instance", xstate), p);
    }
    return p;
}
 
源代码13 项目: Bytecoder   文件: NimbusStyle.java
/**
 * Gets the appropriate border Painter, if there is one, for the state
 * specified in the given SynthContext. This method does appropriate
 * fallback searching, as described in #get.
 *
 * @param ctx The SynthContext. Must not be null.
 * @return The border painter associated for the given state, or null if
 * none could be found.
 */
public Painter<Object> getBorderPainter(SynthContext ctx) {
    Values v = getValues(ctx);
    int xstate = getExtendedState(ctx, v);
    Painter<Object> p = null;

    // check the cache
    tmpKey.init("borderPainter$$instance", xstate);
    p = paintFilter((Painter)v.cache.get(tmpKey));
    if (p != null) return p;

    // not in cache, so lookup and store in cache
    RuntimeState s = null;
    int[] lastIndex = new int[] {-1};
    while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
        if (s.borderPainter != null) {
            p = paintFilter(s.borderPainter);
            break;
        }
    }
    if (p == null) p = paintFilter((Painter)get(ctx, "borderPainter"));
    if (p != null) {
        v.cache.put(new CacheKey("borderPainter$$instance", xstate), p);
    }
    return p;
}
 
源代码14 项目: openjdk-jdk9   文件: SynthPainterImpl.java
private void paintBackground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    // if the background color of the component is 100% transparent
    // then we should not paint any background graphics. This is a solution
    // for there being no way of turning off Nimbus background painting as
    // basic components are all non-opaque by default.
    Component c = ctx.getComponent();
    Color bg = (c != null) ? c.getBackground() : null;
    if (bg == null || bg.getAlpha() > 0){

        Painter<Object> backgroundPainter = style.getBackgroundPainter(ctx);
        if (backgroundPainter != null) {
            paint(backgroundPainter, ctx, g, x, y, w, h,transform);
        }
    }
}
 
源代码15 项目: openjdk-jdk9   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    @SuppressWarnings("unchecked")
    Painter<JComponent> painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码16 项目: openjdk-jdk9   文件: NimbusStyle.java
/**
 * Gets the appropriate background Painter, if there is one, for the state
 * specified in the given SynthContext. This method does appropriate
 * fallback searching, as described in #get.
 *
 * @param ctx The SynthContext. Must not be null.
 * @return The background painter associated for the given state, or null if
 * none could be found.
 */
public Painter<Object> getBackgroundPainter(SynthContext ctx) {
    Values v = getValues(ctx);
    int xstate = getExtendedState(ctx, v);
    Painter<Object> p = null;

    // check the cache
    tmpKey.init("backgroundPainter$$instance", xstate);
    p = paintFilter((Painter)v.cache.get(tmpKey));
    if (p != null) return p;

    // not in cache, so lookup and store in cache
    RuntimeState s = null;
    int[] lastIndex = new int[] {-1};
    while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
        if (s.backgroundPainter != null) {
            p = paintFilter(s.backgroundPainter);
            break;
        }
    }
    if (p == null) p = paintFilter((Painter)get(ctx, "backgroundPainter"));
    if (p != null) {
        v.cache.put(new CacheKey("backgroundPainter$$instance", xstate), p);
    }
    return p;
}
 
源代码17 项目: openjdk-jdk9   文件: NimbusStyle.java
/**
 * Gets the appropriate foreground Painter, if there is one, for the state
 * specified in the given SynthContext. This method does appropriate
 * fallback searching, as described in #get.
 *
 * @param ctx The SynthContext. Must not be null.
 * @return The foreground painter associated for the given state, or null if
 * none could be found.
 */
public Painter<Object> getForegroundPainter(SynthContext ctx) {
    Values v = getValues(ctx);
    int xstate = getExtendedState(ctx, v);
    Painter<Object> p = null;

    // check the cache
    tmpKey.init("foregroundPainter$$instance", xstate);
    p = paintFilter((Painter)v.cache.get(tmpKey));
    if (p != null) return p;

    // not in cache, so lookup and store in cache
    RuntimeState s = null;
    int[] lastIndex = new int[] {-1};
    while ((s = getNextState(v.states, lastIndex, xstate)) != null) {
        if (s.foregroundPainter != null) {
            p = paintFilter(s.foregroundPainter);
            break;
        }
    }
    if (p == null) p = paintFilter((Painter)get(ctx, "foregroundPainter"));
    if (p != null) {
        v.cache.put(new CacheKey("foregroundPainter$$instance", xstate), p);
    }
    return p;
}
 
源代码18 项目: jdk8u-jdk   文件: TableScrollPaneCorner.java
/**
 * Paint the component using the Nimbus Table Header Background Painter
 */
@Override protected void paintComponent(Graphics g) {
    Painter painter = (Painter) UIManager.get(
        "TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter");
    if (painter != null){
        if (g instanceof Graphics2D){
            painter.paint((Graphics2D)g,this,getWidth()+1,getHeight());
        } else {
            // paint using image to not Graphics2D to support
            // Java 1.1 printing API
            BufferedImage img =  new BufferedImage(getWidth(),getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D)img.getGraphics();
            painter.paint(g2,this,getWidth()+1,getHeight());
            g2.dispose();
            g.drawImage(img,0,0,null);
            img = null;
        }
    }
}
 
源代码19 项目: jdk1.8-source-analysis   文件: SynthPainterImpl.java
private void paintBackground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    // if the background color of the component is 100% transparent
    // then we should not paint any background graphics. This is a solution
    // for there being no way of turning off Nimbus background painting as
    // basic components are all non-opaque by default.
    Component c = ctx.getComponent();
    Color bg = (c != null) ? c.getBackground() : null;
    if (bg == null || bg.getAlpha() > 0){
        Painter backgroundPainter = style.getBackgroundPainter(ctx);
        if (backgroundPainter != null) {
            paint(backgroundPainter, ctx, g, x, y, w, h,transform);
        }
    }
}
 
源代码20 项目: jdk1.8-source-analysis   文件: SynthPainterImpl.java
private void paintForeground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    Painter foregroundPainter = style.getForegroundPainter(ctx);
    if (foregroundPainter != null) {
        paint(foregroundPainter, ctx, g, x, y, w, h,transform);
    }
}
 
源代码21 项目: jdk1.8-source-analysis   文件: SynthPainterImpl.java
private void paintBorder(SynthContext ctx, Graphics g, int x, int y, int w,
                         int h, AffineTransform transform) {
    Painter borderPainter = style.getBorderPainter(ctx);
    if (borderPainter != null) {
        paint(borderPainter, ctx, g, x, y, w, h,transform);
    }
}
 
源代码22 项目: openjdk-8   文件: SynthPainterImpl.java
private void paintBorder(SynthContext ctx, Graphics g, int x, int y, int w,
                         int h, AffineTransform transform) {
    Painter borderPainter = style.getBorderPainter(ctx);
    if (borderPainter != null) {
        paint(borderPainter, ctx, g, x, y, w, h,transform);
    }
}
 
源代码23 项目: jdk1.8-source-analysis   文件: NimbusIcon.java
/**
 * Implements the standard Icon interface's paintIcon method as the standard
 * synth stub passes null for the context and this will cause us to not
 * paint any thing, so we override here so that we can paint the enabled
 * state if no synth context is available
 */
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
    Painter painter = (Painter)UIManager.get(prefix + "[Enabled]." + key);
    if (painter != null){
        JComponent jc = (c instanceof JComponent) ? (JComponent)c : null;
        Graphics2D gfx = (Graphics2D)g;
        gfx.translate(x, y);
        painter.paint(gfx, jc , width, height);
        gfx.translate(-x, -y);
    }
}
 
源代码24 项目: dragonwell8_jdk   文件: SynthPainterImpl.java
private void paintBackground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    // if the background color of the component is 100% transparent
    // then we should not paint any background graphics. This is a solution
    // for there being no way of turning off Nimbus background painting as
    // basic components are all non-opaque by default.
    Component c = ctx.getComponent();
    Color bg = (c != null) ? c.getBackground() : null;
    if (bg == null || bg.getAlpha() > 0){
        Painter backgroundPainter = style.getBackgroundPainter(ctx);
        if (backgroundPainter != null) {
            paint(backgroundPainter, ctx, g, x, y, w, h,transform);
        }
    }
}
 
源代码25 项目: dragonwell8_jdk   文件: SynthPainterImpl.java
private void paintForeground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    Painter foregroundPainter = style.getForegroundPainter(ctx);
    if (foregroundPainter != null) {
        paint(foregroundPainter, ctx, g, x, y, w, h,transform);
    }
}
 
源代码26 项目: hottub   文件: NimbusIcon.java
/**
 * Implements the standard Icon interface's paintIcon method as the standard
 * synth stub passes null for the context and this will cause us to not
 * paint any thing, so we override here so that we can paint the enabled
 * state if no synth context is available
 */
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
    Painter painter = (Painter)UIManager.get(prefix + "[Enabled]." + key);
    if (painter != null){
        JComponent jc = (c instanceof JComponent) ? (JComponent)c : null;
        Graphics2D gfx = (Graphics2D)g;
        gfx.translate(x, y);
        painter.paint(gfx, jc , width, height);
        gfx.translate(-x, -y);
    }
}
 
源代码27 项目: dragonwell8_jdk   文件: NimbusStyle.java
private Painter getPainter(Map<String, Object> defaults, String key) {
    Object p = defaults.get(key);
    if (p instanceof UIDefaults.LazyValue) {
        p = ((UIDefaults.LazyValue)p).createValue(UIManager.getDefaults());
    }
    return (p instanceof Painter ? (Painter)p : null);
}
 
源代码28 项目: dragonwell8_jdk   文件: NimbusIcon.java
/**
 * Implements the standard Icon interface's paintIcon method as the standard
 * synth stub passes null for the context and this will cause us to not
 * paint any thing, so we override here so that we can paint the enabled
 * state if no synth context is available
 */
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
    Painter painter = (Painter)UIManager.get(prefix + "[Enabled]." + key);
    if (painter != null){
        JComponent jc = (c instanceof JComponent) ? (JComponent)c : null;
        Graphics2D gfx = (Graphics2D)g;
        gfx.translate(x, y);
        painter.paint(gfx, jc , width, height);
        gfx.translate(-x, -y);
    }
}
 
源代码29 项目: TencentKona-8   文件: SynthPainterImpl.java
private void paintBackground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    // if the background color of the component is 100% transparent
    // then we should not paint any background graphics. This is a solution
    // for there being no way of turning off Nimbus background painting as
    // basic components are all non-opaque by default.
    Component c = ctx.getComponent();
    Color bg = (c != null) ? c.getBackground() : null;
    if (bg == null || bg.getAlpha() > 0){
        Painter backgroundPainter = style.getBackgroundPainter(ctx);
        if (backgroundPainter != null) {
            paint(backgroundPainter, ctx, g, x, y, w, h,transform);
        }
    }
}
 
源代码30 项目: jdk8u_jdk   文件: SynthPainterImpl.java
private void paintForeground(SynthContext ctx, Graphics g, int x, int y,
                             int w, int h, AffineTransform transform) {
    Painter foregroundPainter = style.getForegroundPainter(ctx);
    if (foregroundPainter != null) {
        paint(foregroundPainter, ctx, g, x, y, w, h,transform);
    }
}
 
源代码评论
动弹
沙发等你来抢
 类所在包
 类方法
 同包方法