Прозрачные артефакты пользовательского интерфейса (+UIManager)

У меня есть приложение, которое рисует background image на panel, но для достижения оптимального интерфейса мне нужно установить Component фоны Transparent:

Я сделал каждый компонент прозрачным с помощью UI Manager:uimanager.put(Button, background(new color(0, 0, 0, 0); <- что-то в этом роде, отлично работает, кроме..

onMouseOver component перерисовывает себя (я думаю) и вызывает артефакты.. Как я могу избежать этого в UIManager?

(Я создал класс: uidefaults.java со всеми UIManager настройки)

Заранее спасибо!!

1 ответ

Ну, это довольно просто - НЕ используйте прозрачный фоновый цвет с компонентами (точнее, с любым предком JComponent), которые являются OPAQUE.

Чтобы удалить фоновый компонент, вам не нужно устанавливать прозрачный цвет - просто используйте этот метод:

component.setOpaque ( false );

Это скроет фон компонента, а также изменит стратегию перерисовки компонента, чтобы не создавать артефактов при вызовах перерисовки.

Также, если вы все еще хотите иметь полупрозрачный фон позади вашего компонента, вы можете переопределить метод paintComponent следующим образом:

    JLabel label = new JLabel ( "Transparent background" )
    {
        protected void paintComponent ( Graphics g )
        {
            g.setColor ( getBackground () );
            g.fillRect ( 0, 0, getWidth (), getHeight () );
            super.paintComponent ( g );
        }
    };
    label.setOpaque ( false );
    label.setBackground ( new Color ( 255, 0, 0, 128 ) );

Это заставит метку скрыть фон по умолчанию, а также нарисовать собственный фон (это зависит от свойства фона компонента).

Другие вопросы по тегам