web-dev-qa-db-ja.com

JFrameの背景を透明に設定するが、JPanelまたはJLabelの背景を不透明に設定する方法は?

割り当てに従って、Picasasと同じように画像ビューアを作成する必要があります。真ん中の画像、半透明の黒い背景、左/右ボタンで画像を変更。

アンダーコートに設定した画像を表示したり、半透明のフレームに設定したりできますが、フレームとともに画像が半透明になります。私は何が間違っているのですか。

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();   

JFrame f1 = new JFrame("ShowImage");
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f1.setSize(dim);

f1.setUndecorated(true);
f1.setOpacity(0.5f);
ShowImage panel = new ShowImage();
panel.setBackground(Color.black);

f1.setContentPane(panel); 
f1.setVisible(true);  

私は試した

si.setOpaque();   
si.setBackground(Color.black);
si.setForeground(Color.red);

どれも機能しませんでした

ブール値を取得してテストしたとき

si.isDisplayable();
si.isVisible();
si.isShowing();

目に見えるものだけが真を返し、残りは偽です、これらは何らかの要因ですか?

8
sabbibJAVA

問題は、JFrameのデフォルトのLayoutマネージャーがBorderLayoutであるということです。これは、ShowImageペインがフレームの領域全体(黒で)を埋めていることを意味します。 )。 ShowPaneの背景を赤に変更したかどうかは間違いありません。代わりに完全に赤で塗りつぶされて表示されます

これで、 レイアウトマネージャーのビジュアルガイド を確認するか、ShowPaneの動作方法を変更できます。

[〜#〜]更新[〜#〜]

申し訳ありませんが、Java 7(まだJava 6ハック;))の新しいTransparencyAPIに精通していません

Transparent Frame

これがあなたが探している種類の効果であることを私に確認できますか?読み取られた正方形が画像になる場合(そして黒い背景がフレームです-nb、フレームのみをキャプチャしました)

[〜#〜]更新[〜#〜]

Image Preview

まず、 Window.isOpaque および Window.setBackground を読んで、このソリューションがどのように機能するかを理解します。

次に、使用しないでください Window.setOpacity 、それはあなたが望むものを達成するつもりはありません。主な理由は、不透明度の値が親とその子に適用されることです(これは最初は私を通して)。

したがって、フレームコード:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Make sure where in the top left corner, please lookup how
// to find the screen insets ;)
setLocation(0, 0);
setSize(dim);
// Set undecorated
setUndecorated(true);
// Apply a transparent color to the background
// This is ALL important, without this, it won't work!
setBackground(new Color(0, 255, 0, 0));

// This is where we get sneaky, basically where going to 
// supply our own content pane that does some special painting
// for us
setContentPane(new ContentPane());
getContentPane().setBackground(Color.BLACK);
setLayout(new BorderLayout());

// Add out image pane...    
ShowImage panel = new ShowImage();
add(panel);

setVisible(true);

ContentPane。基本的に、ペイントエンジンを「だまして」、透明(不透明ではない)の場所を考えさせてから、独自の不透明度をペイントする必要があります。

public class ContentPane extends JPanel {

    public ContentPane() {

        setOpaque(false);

    }

    @Override
    protected void paintComponent(Graphics g) {

        // Allow super to Paint
        super.paintComponent(g);

        // Apply our own painting effect
        Graphics2D g2d = (Graphics2D) g.create();
        // 50% transparent Alpha
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));

        g2d.setColor(getBackground());
        g2d.fill(getBounds());

        g2d.dispose();

    }

}

以前の回答で申し訳ありませんが、これで補うことができれば幸いです;)

ボタン付きの更新

これは私がそれを変更した方法です

ShowImage panel = new ShowImage();
panel.setBackground(Color.RED);

setContentPane(new ContentPane());
getContentPane().setBackground(Color.BLACK);
setLayout(new BorderLayout());
add(panel);

JPanel pnlButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
pnlButtons.setOpaque(false);
pnlButtons.add(new JButton("<<"));
pnlButtons.add(new JButton("<"));
pnlButtons.add(new JButton(">"));
pnlButtons.add(new JButton(">>"));

// Okay, in theory, getContentPane() is required, but better safe the sorry
getContentPane().add(pnlButtons, BorderLayout.SOUTH);

setVisible(true);

Sample with Buttons

20
MadProgrammer