4

JFrameの境界線を透明にしたいので、自分のBorderクラスを使用してそうしようとしています...

private class ShadowBorder extends AbstractBorder {

    private static final int RADIUS = 30;

    @Override
    public boolean isBorderOpaque() {
        return false;
    }

    @Override
    public Insets getBorderInsets(Component c) {
        return new Insets(RADIUS, RADIUS, RADIUS, RADIUS);
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        insets.top = RADIUS;
        insets.left = RADIUS;
        insets.bottom = RADIUS;
        insets.right = RADIUS;
        return insets;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                 RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(new Color(0x66000000, true));

            g2d.fillRect(0, 0, width - RADIUS, RADIUS);
        }
}

しかし、最終的には境界線は透明ではありません。境界線の内側にも白い背景がありますが、理由はわかりません(atach.imageを参照)。何か案は?

ここに画像の説明を入力してください

ありがとう!

4

2 に答える 2

5

カスタムの透明な境界線でJFrameを作成するには、最初にフレームの不透明度を変更する必要があります。

frame.setUndecorated ( true );
AWTUtilities.setWindowOpaque ( frame, false );

その後、フレームにはシステムの境界線と背景がまったくないため、透明なもの(境界線など)をペイントできます。ちなみに、フレームの後ろのピクセルを「通過」させるには、変更する境界線のコンポーネントは、コンポーネントの下のコンテナと同様に不透明でない必要があります。

また、場合によっては、フレーム全体を半透明にすることができます。

AWTUtilities.setWindowOpacity ( frame, 0.5f );

これにより、50%透明になります(システムウィンドウの装飾でも機能します)。

これらの機能は、まだWinおよびMacOSシステムでのみ適切にサポートされています。

于 2012-05-02T08:42:31.613 に答える
4

ウィンドウを不透明ではないものとして設定し、グラフィックスでコンポジットを使用する必要があります。また、コードでは、4つの境界線ではなく、1つの境界線のみを印刷しているため、1つの境界線のみがペイントされています。このような何かがそれを行うはずです(ただし、RADIUS定数ではなく、はめ込みに基づいて境界線をペイントする方が良いでしょう):

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.io.UnsupportedEncodingException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;

import com.sun.awt.AWTUtilities;

public class Main {

    private static class ShadowBorder extends AbstractBorder {

        private static final int RADIUS = 30;

        @Override
        public boolean isBorderOpaque() {
            return false;
        }

        @Override
        public Insets getBorderInsets(Component c) {
            return new Insets(RADIUS, RADIUS, RADIUS, RADIUS);
        }

        @Override
        public Insets getBorderInsets(Component c, Insets insets) {
            insets.top = RADIUS;
            insets.left = RADIUS;
            insets.bottom = RADIUS;
            insets.right = RADIUS;
            return insets;
        }

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(new Color(66, 0, 0));
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_ATOP, 0.5f));
            g2d.fillRect(0, 0, width - RADIUS, RADIUS);
            g2d.fillRect(width - RADIUS, 0, RADIUS, height - RADIUS);
            g2d.fillRect(0, RADIUS, RADIUS, height - RADIUS);
            g2d.fillRect(RADIUS, height - RADIUS, width - RADIUS, RADIUS);
        }
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        AWTUtilities.setWindowOpaque(frame, false);
        JPanel panel = new JPanel(new BorderLayout());
        JButton button = new JButton("Hello");
        panel.add(button);
        panel.setBorder(new ShadowBorder());
        frame.setContentPane(panel);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}
于 2012-05-02T09:13:18.123 に答える