首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFrame上未显示GlassPane

JFrame上未显示GlassPane
EN

Stack Overflow用户
提问于 2012-06-26 21:51:22
回答 3查看 4.7K关注 0票数 3

我一直在尝试为我的游戏中的HUD实现一个GlassPane,但是现在我似乎不能让JFrame将我的GlassPane设置为它自己的,我已经使用了setGlassPane(),我已经阅读了一些例子试图找出我的错误,但是什么都没有。所以我写了一个SSCCE来演示我的问题。我有一个JFrame,我在其中添加了一个带有"TESTIING“标签的Jpanel,然后启动galss窗格,并在frames实例上调用setGlassPane()。我的GlassPane有一个MouseListener,一个JPanel和两个JLabels,还有一个被覆盖的paint(),但是MouseListener不工作paint()不会显示,我的标签也不在那里(所以基本上我的GlassPane没有被设置为我的帧新GlassPane)- -

代码语言:javascript
复制
/*Main.java*/

import java.awt.EventQueue;

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TestGlassPane testGlassPane=new TestGlassPane();
                testGlassPane.setVisible(true);
            }
        });
    }
}

/*TestGlassPane.java*/

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class TestGlassPane extends JFrame{
    private GlassGamePane m_glassPane;
    private JPanel drawingPanel;
    private JLabel testLabel;

    public TestGlassPane() {
        createUI();
    }
    private void createUI() {
        setTitle("Test GlassGamePane");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(800, 700);
        setResizable(false);
        setLocationRelativeTo(null);

        createComponents();
        //add components to frames content pane
        addComponentsToContentPane(getContentPane());


        //setting glassPane 
        m_glassPane = new GlassGamePane();
        //set opaque to false, i.e. make transparent 
        m_glassPane.setOpaque(false);
        m_glassPane.setVisible(true);

        getRootPane().setGlassPane(m_glassPane);
    }

    private void addComponentsToContentPane(Container contentPane) {
        drawingPanel.add(testLabel);
        contentPane.add(drawingPanel, BorderLayout.CENTER);
    }

    private void createComponents() {
        drawingPanel=new JPanel(new BorderLayout());
        testLabel=new JLabel("TESTIING");
    }
}

/*GlassGamePane.java*/

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GlassGamePane extends JPanel implements MouseListener {

    private JPanel statusPanel;
    private JLabel healthLabel;

    public GlassGamePane() {
        createGlassPane();
    }

    private void createGlassPane() {
        setLayout(new BorderLayout());
        createComponents();
        statusPanel.add(healthLabel);
        add(statusPanel, BorderLayout.NORTH);
        addMouseListener(this);
    }

    private void createComponents() {
        statusPanel = new JPanel(new GridLayout(2, 6));
        healthLabel = new JLabel("Player Health:");
        healthLabel.setForeground(Color.RED);
        healthLabel.setBackground(Color.BLUE);

    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        //Draw an oval in the panel  
        g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);
    }

    @Override
    public void mouseClicked(MouseEvent me) {
        Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void mousePressed(MouseEvent me) {
        Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void mouseReleased(MouseEvent me) {
    }

    @Override
    public void mouseEntered(MouseEvent me) {
    }

    @Override
    public void mouseExited(MouseEvent me) {
    }
}

谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-26 22:15:48

在使GlassPane可见之前,您似乎必须首先将自定义GlassPane添加为您的框架GlassPane!这里的代码似乎可以工作:

代码语言:javascript
复制
    //setting glassPane 
    m_glassPane = new GlassGamePane();
    setGlassPane(m_glassPane);
    //set opaque to false, i.e. make transparent 
    m_glassPane.setOpaque(false);
    m_glassPane.setVisible(true);
票数 4
EN

Stack Overflow用户

发布于 2012-06-26 22:26:16

来自JavaDoc:http://docs.oracle.com/javase/7/docs/api/javax/swing/JRootPane.html#setGlassPane(java.awt.Component

您需要在将glasspane添加到JRootPane之后将其设置为可见。

票数 2
EN

Stack Overflow用户

发布于 2012-06-26 22:27:36

Glasspane看起来就像是正确创建的一样,但是Glasspane要覆盖的只是轻量级的

  • ,否则是落后的,隐藏的是重量级的Swing或者AWT JComponent没有实现任何LayoutManager,你必须设置适当的LayoutManager

  • for测试把非不透明的JLabel放入一些背景

  • 我很喜欢Glasspane,但是你可以使用JLayer (Java7)基于JXLayer (Java6)或者OverlayLayout,作为最简单的

的方式

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

https://stackoverflow.com/questions/11208845

复制
相关文章

相似问题

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