Java Swing - полупрозрачные компоненты - PullRequest
2 голосов
/ 13 февраля 2011

Я недавно задал вопрос о полупрозрачных компонентах, вызывающих странные артефакты, которые, по-видимому, не обновляются должным образом.Ответ, который я получил, заставил артефакты исчезнуть, но ценой прозрачности.

Решением было для каждого полупрозрачного компонента также вызвать функцию setOpaque (false).Таким образом, Swing знал, что нужно перерисовать фон за этими компонентами.

Однако это произошло за счет прозрачности, которой я пытался достичь.Это привело к тому, что компоненты стали прозрачными.

Предпосылка заключается в следующем: я проектирую графический интерфейс для клиента чата, и запрос функции должен был иметь фон.Я успешно получил фоновую работу, следуя фрагменту кода для расширения класса JPanel, но затем я хотел, чтобы компоненты отображали фон.После установки их прозрачности, остатки обновленных компонентов отображались там, где их не должно было быть.Я пришел сюда и решил мою проблему, но теперь у меня есть новая проблема.Итак, мы здесь.

Итак, вот что я догадался:

- Вызов функции setOpaque (false) для каждого требуемого компонента и НЕ установка полупрозрачного цвета не достигает того, что яхочу.

-Установка полупрозрачного цвета и НЕ вызывая setOpaque (false) позволяет показывать полупрозрачный фон, но вызывает артефакты, возвращая меня на круги своя.

Так что мне нужно немного среднего уровнямежду прозрачным без артефактов и полупрозрачным с артефактами.А именно, я хочу полупрозрачный фон (не полностью прозрачный), в котором нет артефактов.

Похоже, мне нужно переопределить JFrame, чтобы он перекрасил все свои компоненты, независимо от прозрачности.Если только что-то мне не хватает ... вот почему я здесь!

Спасибо!

(Вот ссылка на оригинальный вопрос с картинкой для справки: JavaСвинг - полупрозрачные компоненты, вызывающие артефакты )

1 Ответ

4 голосов
/ 13 февраля 2011

Одним из вариантов будет переопределить компоненты и нарисовать фон самостоятельно:

class TranslucentLabel extends JLabel {
    public TranslucentLabel(String text) {
        super(text);
        setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(new Color(255, 0, 0, 64));
        Insets insets = getInsets();
        g.fillRect(insets.left, insets.top, 
                getWidth() - insets.left - insets.right, 
                getHeight() - insets.top - insets.bottom);
        super.paintComponent(g);
    }
}

РЕДАКТИРОВАТЬ: В качестве альтернативы вы можете нарисовать полупрозрачный цвет фона для дочерних компонентов непосредственно на панели, тогда вы не будете иметьдля переопределения компонентов:

class YourPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g.create();

        // Draw your background image here to g2d.

        g2d.setColor(new Color(255, 0, 0, 64));
        Area area = new Area();
        for (Component component : getComponents()) {
            area.add(new Area(component.getBounds()));
        }
        g2d.fill(area);
        g2d.dispose();
    }
}

У этого подхода есть недостаток.Если есть действительно прозрачная часть компонента (например, округленная граница), тогда весь его фон будет окрашен.

...