JProgressBar の上に JSlider を重ねようとしています。2 つのコンポーネントを保持するために JLayeredPane を使用しています。JProgressBar を JLayeredPane に追加してから、JSlider を追加しています。これまでのところ、opaque を false に設定し、paintComponent メソッドをオーバーライドすることで、JSlider を透明にしようとしました。最終的には、スライダー ハンドルが透明になる唯一の部分であり、背景は不透明なままです。JLayeredPane を正しく使用していない可能性がありますが、JLabels を使用したテストはうまくいったようです。JSlider の背景を透明にするにはどうすればよいですか?
JSlider slider = new JSlider()
{
@Override
public void paintComponent(java.awt.Graphics g)
{
java.awt.Graphics2D g2 = (java.awt.Graphics2D) g;
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, (float) 0.5));
super.paintComponent(g2);
}
};
ご協力ありがとうございました。あなたの例を通して、私の問題は私が使用している JLayeredPane にあることがわかりました。JSlider の背景を透明にできることは認識していますが、下のレイヤーのコンポーネントを透けて表示することはまだできません。これは私の例です:
public class SliderTest extends JFrame
{
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
SliderTest frame = new SliderTest();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public SliderTest()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout(new BorderLayout(0, 0));
JLayeredPane layeredPane = new JLayeredPane();
panel.add(layeredPane, BorderLayout.CENTER);
layeredPane.setLayout(new BorderLayout(0, 0));
JProgressBar progressBar = new JProgressBar();
progressBar.setValue(50);
layeredPane.add(progressBar);
layeredPane.setLayer(progressBar, 0);
JSlider slider = new JSlider()
{
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(getBackground());
g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
super.paintComponent(g);
}
};
layeredPane.setLayer(slider, 1);
slider.setOpaque(false);
// layeredPane.setLayer(slider, 1);
layeredPane.add(slider, BorderLayout.CENTER);
}
}