Прозрачный JButton все еще рисует свой фон - PullRequest
4 голосов
/ 08 мая 2011

У меня есть полупрозрачный JPanel.Я создал пользовательский JButton , расширив JButton, поскольку мне требовалась кнопка со скругленными углами, и я хотел добавить к ней некоторые эффекты.Я сделал кнопку непрозрачной .Когда я добавляю эту кнопку в мою полупрозрачную JPanel, она выглядит хорошо.Но на ролловере за кнопкой нарисовано черное пятно, которое выглядит действительно дрянно.Я искал в сети решение, но не смог найти полезного.Эта проблема также описана в http://www.java.net/node/661798, но я не смог действительно заставить предложение kirillcool сработать ..... Любая помощь будет оценена

Ответы [ 2 ]

7 голосов
/ 08 мая 2011

Я считаю, что вам нужно добавить:

button.setContentAreaFilled( false );
0 голосов
/ 04 марта 2012

не уверен, если кто-то все еще заинтересован ... вы можете решить эту проблему, переопределив метод paintComponent(), чтобы Java рисовала JButton в любом Shape, который вам нравится.вам просто нужно установить прозрачный фон объекта Graphics с помощью метода setBackground().Также вам нужно очистить графический объект ДО рисования на нем методом clearRect(), а затем снова заполнить его альфа-уровнем фона вашего JButton.вот мой кусок кода .. он показывает переопределенный 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);
}
...