web-dev-qa-db-ja.com

透明なJPanel

半透明のJPanelを作りたいです。カラーコンストラクターのRGBA値を使用するだけで実行しましたが、問題は、イベント処理を使用しているときに正しく動作しない場合です。私の要件は、マウスが入るとこのパネルの境界が見えるようになり、マウスが出ると境界が見えなくなる半透明のJpanelです。私は次のコードでこれを行いましたが、問題は透明な背景(RGBA)では正しく機能しないが、RGBカラーでは正常に機能することです。

import javax.swing.*;
import javax.swing.border.*;
import Java.awt.*;
import Java.awt.event.*;

public class MDCW extends JFrame {

      private JPanel contentPane;

     /**
     * Launch the application.
     */
     public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MDCW frame = new MDCW();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MDCW() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1013, 551);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(0, 139, 139));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        final JPanel panel = new JPanel();

        panel.setBackground(new Color(0, 0, 0,50));
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                panel.setBorder(new LineBorder(new Color(255, 255, 255), 5));   
            }
            @Override
            public void mouseExited(MouseEvent e) {
                panel.setBorder(null);  
            }
        });
        panel.setBounds(360, 155, 215, 215);
        contentPane.add(panel);

        final JPanel panel_1 = new JPanel();
        panel_1.setBackground(new Color(0, 0, 0));
        panel_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                panel_1.setBorder(new LineBorder(new Color(255, 255, 255), 5)); 
            }
            @Override
            public void mouseExited(MouseEvent e) {
                panel_1.setBorder(null);    
            }
        });
        panel_1.setBounds(84, 155, 215, 215);
        contentPane.add(panel_1);
    }
}
12
Pawan Gupta

JPanelは半透明の背景をサポートしていません。この問題を処理するには、次の2つの手順が必要です。

  • まず、正しく機能する透明度を得るには、パネル上で必須setOpaque(false);そうしないと、不透明なパネルがその境界の下にあるものを完全に覆うと想定されるため、グリッチが発生します。

  • ただし、opaquefalseの場合、パネルも背景をまったく描画しないため(!)、paintComponentで背景を描画する必要があります。

これは、これらの両方のステップを処理するドロップイン置換クラスです。

private class TransparentPanel extends JPanel {
    {
        setOpaque(false);
    }
    public void paintComponent(Graphics g) {
        g.setColor(getBackground());
        Rectangle r = g.getClipBounds();
        g.fillRect(r.x, r.y, r.width, r.height);
        super.paintComponent(g);
    }
}

最初のパネル作成を次のように変更すると、プログラムで機能することを確認しました。

final JPanel panel = new TransparentPanel();
21
Kevin Reid

そのようにするのは簡単です:

// initialise JPanel 
JPanel somePanel = new JPanel(new GridBagLayout());
somePanel.setBackground(new Color(0,0,0,x);

この場合のxは、探している透明度のレベルです。0は非表示、100は実線です。

例えば:

somePanel.setBackground(new Color(0,0,0,55)

参照: http://docs.Oracle.com/javase/7/docs/api/Java/awt/Color.htmlhttp://docs.Oracle.com/javase/ 7/docs/api/javax/swing/JComponent.html

5
Sheku Kanneh