私は半透明のJPanelを持っています。角の丸いボタンが必要で、いくつかの効果を追加したかったので、JButton を拡張してカスタム JButtonを作成しました。ボタンを非不透明にしました。このボタンを半透明の JPanel に追加すると、問題なく表示されます。しかし、ロールオーバーすると、ボタンの後ろに黒いパッチが描かれ、本当に安っぽく見えます. 解決策をネットで検索しましたが、役立つものは見つかりませんでした。この問題は http://www.java.net/node/661798でも説明されていますが、kirillcool の提案を実際に実行することはできませんでした.....
質問する
5126 次
2 に答える
7
追加する必要があると思います:
button.setContentAreaFilled( false );
于 2011-05-08T17:10:29.927 に答える
0
誰かがまだ興味を持っているかどうかわからない...メソッドをオーバーライドして、Javaが好きな形状でpaintComponent()
描画できるようにすることで、問題を解決できます。JButton
メソッドで Graphics オブジェクトの背景を透明に設定するだけですsetBackground()
。また、メソッドで描画する前に Graphics オブジェクトをクリアしてclearRect()
から、背景のアルファ レベルで再度塗りつぶす必要がありますJButton
。ここに私のコードがあります..それはoverridenを示していますpaintComponent()
。それをあなたに貼り付けることで、半透明の背景であっても丸みを帯びたエッジJButton
が得られるはずですJButton
private int outerRoundRectSize = 10;
private int innerRoundRectSize = 8;
public void paintComponent(Graphics g)
{
int h = getHeight();
int w = getWidth();
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color GP = null;
//////////////get rid of the black background////////////////////////
g2d.setBackground(new Color(0,0,0,0.0f));
g2d.clearRect(0, 0, w, h);
g2d.setPaint(new Color(0,0,0,0.3f));
g2d.fillRect(0, 0, w, h);
//////////////get rid of the black background////////////////////////
ButtonModel model = getModel();
if(!model.isEnabled())
{
setForeground(Color.GRAY);
GP = new Color(0.5f,0.2f,0.6f);
}
else
{
setForeground(Color.WHITE);
if(model.isRollover())
{
GP = new Color(0.5f,0.2f,0.6f);
}
else
{
GP = new Color(0.0f,1.0f,0.0f);
}
}
g2d.setPaint(GP);
Color p1 = null;
Color p2 = null;
if(getModel().isPressed())
{
GP = new Color(1.0f,0.0f,0.0f);
g2d.setPaint(GP);
p1=new Color(0.12f,0.7f,0.3f);
p2=new Color(0.7f,0.5f,0.6f);
}
else
{
p1=new Color(0.0f,0.5f,0.7f);
p2=new Color(0.0f,1.0f,1.0f);
GP = new Color(0.0f,0.0f,1.0f);
}
RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1, h - 1, outerRoundRectSize, outerRoundRectSize);
Shape clip = g2d.getClip();
g2d.clip(r2d);
//g2d.fillRect(0, 0, w, h);
g2d.fillRoundRect(0, 0, w, h, outerRoundRectSize, outerRoundRectSize);
g2d.setClip(clip);
g2d.setPaint(p1);
g2d.drawRoundRect(0, 0, w - 1, h - 1, outerRoundRectSize,outerRoundRectSize);
g2d.setPaint(p2);
g2d.drawRoundRect(1, 1, w - 3, h - 3, innerRoundRectSize,innerRoundRectSize);
g2d.dispose();
super.paintComponent(g);
}
于 2012-03-04T18:50:20.677 に答える