1
 public class FadingLayer extends JPanel {

    public FadingLayer(JPanel panel) {
        // when set to "insets 0 0 0 0", shows the FadingPanel without fading.
        setLayout(new MigLayout("insets 1 0 0 0"));  
        add(panel,"dock center");
        setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics arg0) {
        Graphics2D graphics = (Graphics2D) arg0;
        AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);
        graphics.setComposite(alpha);
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, getWidth(), getHeight());
    }
}

これはフェード効果を入れているパネルです。不透明度は、swing の Timer クラスを使用して更新されます。問題は、すべてのインセット値が 0 タイマーに設定されている場合ですが、フェード効果なしで最終結果が表示されるだけです。しかし、インセットの 1 つでもゼロ以外の値に設定されていると、フェード効果が見られます。どうしたの、助けて?

EDIT : パネル ( に追加されるFadingPanel) が完全な領域を取得するときに発生します。それは次のようにFadingPanel設定されているときです-->

 setLayout(new BorderLayout());
 add(panel,BorderLayout.CENTER);

また

setLayout(new MigLayout("insets 0 0 0 0"));
add(panel,"dock center");
4

1 に答える 1

3

SagarDabas の答えは正しいです。ちょっとしたコメントをしたいと思います

public void paintComponent(Graphics arg0) {
    Graphics2D graphics = (Graphics2D) arg0;
    AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);
    graphics.setComposite(alpha);
    graphics.setColor(getBackground());
    graphics.fillRect(0, 0, getWidth(), getHeight());
}

グラフ コンテキストを操作するときは、十分に注意する必要があります。上記のコードは、その後にペイントされたすべてのコンポーネントに影響します (アルファ コンポジットは適用されたままです)。

より良いアプローチは、開始する前にグラフィックをコピーすることです。

public void paintComponent(Graphics arg0) {
    Graphics2D graphics = (Graphics2D) arg0.create();
    // paint as normal
    graphics.dispose();
}
于 2012-08-20T21:12:17.660 に答える