1

パネルの影を作成するために、 swingx のShadowRendererを使用しようとしています。これが私がこれまでにしたことです:

  • パネル コンストラクターでシャドウ レンダラーを 1 回作成します。

    public CustomPanel() {
        super();
        renderer = new ShadowRenderer(20, 0.5f, Color.RED);
    }
    
  • パネルのサイズが変更されるたびに、新しい影を再計算します。

    @Override
    public void setBounds(int x, int y, int width, int height) {
        super.setBounds(x, y, width, height);
        shadow = renderer.createShadow(GraphicsUtilities.createCompatibleTranslucentImage(width, height));
    }
    
  • そして、パネルのメソッドをオーバーライドしてpaintComponent、生成された画像を描画します。

    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
    
        g2.drawImage(shadow, 0, 0, null);
        //super.paintComponent(g);
    }
    

しかし、shadow画像は決して表示されません。なんで?私はこれを読んで、シャドウレンダラーによって生成された一種の「影付き」画像を描画するコードを除いて。

4

1 に答える 1

4

これがDropShadowDemoの短縮例です

JXPanel panel = new JXPanel() {
    int shadowSize = 40;
    ShadowRenderer renderer = new ShadowRenderer(shadowSize/ 2, 0.5f, Color.RED); 
    BufferedImage imageA = 
            XTestUtils.loadDefaultImage("moon.jpg");
    BufferedImage shadow;

    @Override
    public void setBounds(int x, int y, int width, int height) {
        super.setBounds(x, y, width, height);
        // not really needed here - the base image size is fixed
        shadow = renderer.createShadow(imageA); 
    }

    @Override
    protected void paintComponent(Graphics g) {
        int x = (getWidth() - imageA.getWidth()) / 2;
        int y = (getHeight() - imageA.getHeight()) / 2;

        Graphics2D g2 = (Graphics2D) g;
        Composite c = g2.getComposite();
        g2.setComposite(AlphaComposite.SrcOver.derive(renderer.getOpacity()));
        g.drawImage(shadow, x - shadowSize / 2, y - shadowSize / 2, null);
        g2.setComposite(c);
        g.drawImage(imageA, x, y, null);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(imageA.getWidth() + shadowSize, imageA.getHeight()+ shadowSize);
    }

};
panel.setOpaque(false);
于 2012-09-26T10:14:39.750 に答える