首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GlassPane的行为很奇怪

GlassPane的行为很奇怪
EN

Stack Overflow用户
提问于 2014-10-18 17:02:30
回答 1查看 275关注 0票数 2

我在里面创建了一个JPanel,我放了一个JCheckBox和两个按钮:

选中复选框时,会在面板上方显示透明颜色(alpha = 100)的glassPane,并包含一个显示String“that .”的标签,问题是在显示glassPane时,复选框的位置会发生变化:

当我改变框架的大小时,glassPane变得不透明,所有在玻璃玻璃下面可见的成分都变得看不见了。

当我将大小更改为较小的大小时,glassPane的背景会变暗,标签字符串“加载”变得模糊。

下面是我的代码,它受甲骨文教程关于GlassPane GlassPane教程的启发。

代码语言:javascript
复制
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();
        }
    }
}

有人能纠正我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-18 17:47:37

查看透明背景,了解问题的可能原因和几个解决方案。基本上,因为你使用的是透明的背景,你需要确保你自己画玻璃的背景。

因此,我会创建一个自定义面板作为您的玻璃窗格,以便您可以管理的绘画背景。然后将此面板设置为框架的玻璃窗格。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26442334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档