GlassPane ведет себя странно

Я создал JPanel внутри него, я поместил JCheckBox и две кнопки:

введите здесь описание изображения

когда установлен флажок, стеклянная панель с прозрачным цветом (альфа = 100) отображается над панелью и содержит метку, отображающую String "Загрузка...", проблема заключается в том, что расположение флажка изменяется, когда отображается стеклянная панель:

введите здесь описание изображения

и когда я изменяю размер кадра, стеклянная панель становится непрозрачной, и все компоненты, которые были видны под стеклянной панелью, становятся невидимыми.

введите здесь описание изображения

и когда я меняю размер на меньший размер, фон GlassPane меняется и становится темнее, а строка метки «Загрузка» становится размытой.

введите здесь описание изображения

Вот мой код, вдохновленный учебником Oracle по GlassPane Учебник по GlassPane

package com.training.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class Training extends JFrame
{
    JCheckBox changeGlass;
    JButton button1, button2;

    public Training()
    {
        setBounds(100, 100, 400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Test Glass Pane");
        getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));

        JPanel glass = (JPanel) getGlassPane();
        glass.setOpaque(true);
        glass.setBackground(new Color(120, 120, 120, 100));
        glass.setLayout(new BorderLayout());
        glass.add(new JLabel("Loading ..."));

        changeGlass = new JCheckBox("Show Glass Pane", false);

        changeGlass.addItemListener(new ItemListener()
        {
            public void itemStateChanged(ItemEvent e)
            {
                glass.setVisible(e.getStateChange() == ItemEvent.SELECTED);
            }
        });

        button1 = new JButton("Select");
        button2 = new JButton("Change");

        getContentPane().add(changeGlass);
        getContentPane().add(button1);
        getContentPane().add(button2);

        glass.addMouseListener(new MouseListener()
        {
            public void mouseReleased(MouseEvent e)
            {
                redispatchEvent(e, (JPanel) getContentPane(), glass);
            }

            public void mousePressed(MouseEvent e)
            {
                redispatchEvent(e, (JPanel) getContentPane(), glass);
            }

            public void mouseExited(MouseEvent e)
            {
                redispatchEvent(e, (JPanel) getContentPane(), glass);
            }

            public void mouseEntered(MouseEvent e)
            {
                redispatchEvent(e, (JPanel) getContentPane(), glass);
            }

            public void mouseClicked(MouseEvent e)
            {
                redispatchEvent(e, (JPanel) getContentPane(), glass);
            }
        });
    }

    public void redispatchEvent(MouseEvent e, JPanel panel, JPanel glass)
    {
        Point panelPoint = SwingUtilities.convertPoint(glass, e.getPoint(), panel);
        Component c = SwingUtilities.getDeepestComponentAt(panel, (int) panelPoint.getX(), (int) panelPoint.getY());

        Point componentPoint = SwingUtilities.convertPoint(panel, panelPoint, c);

        if (c != null && c.equals(changeGlass))
        {
            c.dispatchEvent(new MouseEvent(c, e.getID(), e.getWhen(), e.getModifiers(), (int) componentPoint.getX(), (int) componentPoint.getY(), e.getClickCount(), e
                    .isPopupTrigger()));
        }
        else
        {
            e.consume();
        }
    }
}

Может ли кто-нибудь исправить меня, что я делаю неправильно?


person Naruto Biju Mode    schedule 18.10.2014    source источник
comment
Боюсь, Swing плохо справляется с полупрозрачностью. Для этого есть хитрости, но мне придется их поискать.   -  person Hovercraft Full Of Eels    schedule 18.10.2014
comment
@HovercraftFullOfEels Таким образом, прозрачность с помощью GlassPane невозможна, как это работает с setOpacity JFrame, я нашел решение - подготовить изображение png с более низкой альфой и добавить изображение для маркировки как imageIcon, но я не знаю, как растянуть изображение до занять все пространство GlassPane.   -  person Naruto Biju Mode    schedule 18.10.2014
comment
Я верю, что это возможно, но для этого нужны некоторые хитрости (где @camickr или MadProgrammer, когда они вам нужны?). Возможно, было бы лучше использовать JLayer. Я проверяю это прямо сейчас.   -  person Hovercraft Full Of Eels    schedule 18.10.2014


Ответы (1)


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

Поэтому я бы создал пользовательскую панель для использования в качестве стеклянной панели, чтобы вы могли управлять рисованием фона. Затем вы устанавливаете эту панель в качестве стеклянной панели рамы.

person camickr    schedule 18.10.2014
comment
1+, посмотрите мой комментарий к исходному вопросу — вы ответили на мою молитву! - person Hovercraft Full Of Eels; 18.10.2014
comment
@HovercraftFullOfEels Спасибо за ваши молитвы о помощи таким новичкам, как я. - person Naruto Biju Mode; 18.10.2014