Как создать частично прозрачный JButton на полностью прозрачном JFrame? - PullRequest
6 голосов
/ 10 сентября 2011

Я могу сделать JFrame полностью прозрачным, а JButton частично прозрачным, пока я не переместлю свою мышь на кнопку (не щелкаю) и не уберу мышь с кнопки (MouseExited вызывается через MouseListener).Что происходит, так это то, что фон JButton отрисовывается снова, поэтому после нескольких движений мыши при включении и выключении кнопки кнопка становится полностью непрозрачной.

public class ButtonExample extends JWindow
{
   public ButtonExample( )
   {
        JButton But = new JButton( "Testing" );
        But.setBackground( new Color( 0, 0, 0, 200 ) );
        But.setForeground( new Color( 70, 155, 255 ) );
        this.add( But );
        this.setBackground( new Color( 0, 0, 0, 0 ) );
        this.setMinimumSize( new Dimension( 200,100 ) );
        this.setVisible( true );
    }

    public static void main( String[ ] Args ) 
    {
        new ButtonExample( );
    }
}

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

проблема в том, что кнопка сообщает о полной непрозрачности, хотя на самом деле это не так (из-за частично прозрачного цвета)

  but.setOpaque(false);

Кстати: как вы видите, я изменил имя поля в соответствии с соглашениями об именах Java :-)

Редактировать

arggghh .. пропустил это, извини. Нужно проверить, что мы делаем в SwingX, от всей головы я бы сказал, что вам нужно переопределить paintComponent и самостоятельно обрабатывать фоновый рисунок, например

        /** 
         * @inherited <p>
         */
        @Override
        protected void paintComponent(Graphics g) {
            if (!isOpaque() && getBackground().getAlpha() < 255) {
                g.setColor(getBackground());
                g.fillRect(0, 0, getWidth(), getHeight());
            }
            super.paintComponent(g);
        }

не пытался, хотя, может быть, "становится более непрозрачным" снова вернулся с этим ... вернусь завтра

Редактировать 2

хорошо, проверено - отредактированный код работает правильно. Итак, подведем итог: компоненты с полупрозрачным фоном

  • должен сообщить, что они непрозрачны, чтобы не перепутать механизм рисования по умолчанию
  • должен взять на себя рисование фона и заполнить его самим цветом фона (SwingX JXPanel f.i. Явно поддерживает свойство alpha)

для вашего удобства, вот небольшой прогон с некорректным / правильным фоном рядом

public class TransparentButton  {

    public TransparentButton() {
        JWindow incorrectOpaque = createWindow("incorrect opaque", true);
        incorrectOpaque.setLocation(600, 600);
        incorrectOpaque.setVisible(true);
        JWindow correctOpaque = createWindow("correct opaque", false);
        correctOpaque.setLocation(800, 600);
        correctOpaque.setVisible(true);
    }


    private JButton createButton(final boolean opaque) {
        JButton but = new JButton("Testing") {

            /**
             * @inherited <p>
             * Overridden to take over background painting with 
             * transparent color.
             */
            @Override
            protected void paintComponent(Graphics g) {
                if (!isOpaque() && getBackground().getAlpha() < 255) {
                    g.setColor(getBackground());
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
                super.paintComponent(g);
            }

        };
        but.setBackground(new Color(0, 0, 0, 100));
        but.setForeground(new Color(70, 155, 255));
        but.setOpaque(opaque);
        return but;
    }

    private JWindow createWindow(String text, boolean opaque) {
        JWindow window = new JWindow();
        JButton but = createButton(opaque);
        window.add(but);
        window.add(new JLabel(""), BorderLayout.SOUTH);
        window.setOpacity(0.5f);
        window.setBackground(new Color(0, 0, 0, 0));
        window.setSize(new Dimension(200, 100));
        return window;
    }

    public static void main(String[] Args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                new TransparentButton();
            }
        });
    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger.getLogger(TransparentButton.class
            .getName());
}
0 голосов
/ 10 сентября 2011
...