玻璃面板在JFrame上没有显示出来

3
我一直在尝试为我的游戏内HUD实现一个GlassPane,但是现在我似乎无法让JFrame将我的GlassPane设置为其自己的。我已经使用了setGlassPane(),并阅读了一些示例,试图找到我的错误,但是没有什么发现。因此我写了一个SSCCE来演示我的问题。我有一个JFrame,我向其中添加了一个带有标签“TESTIING”的JPanel,然后我初始化了我的glass pane,并在我的Frames实例上调用了setGlassPane()。我的GlassPane有一个MouseListener,一个JPanel和2个JLabels,并重写了paint(),但是MouseListener不起作用,paint()也不显示,我的标签也不存在(所以基本上我的GlassPane没有被设置为我的frame的新GlassPane)。
/*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) {
    }
}

谢谢你。

3个回答

4
似乎你需要先将自定义的"GlassPane"添加为帧的"GlassPane",然后再使"GlassPane"可见!以下代码看起来可以实现这一点:
    //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);

2

哈哈,是的,谢谢。在测试各种方法时,我将setGlassPane(m_glasspane);方法移到了m_glasspane.setVisible(true);上面,这样就可以工作了。不过如果我读了文档就更容易了:P - David Kroukamp

1
  • 看起来Glasspane已经正确创建,但是Glasspane只能覆盖轻量级JComponent,否则会被重量级Swing或AWT J/Component隐藏

  • Glasspane没有实现任何LayoutManager,您必须设置适当的LayoutManager

  • 为了测试,请放置一个不透明的带有一些背景的JLabel

  • 我喜欢Glasspane,但您可以使用基于JXLayer(Java6)或OverlayLayout的JLayer(Java7)作为最简单的方法


有趣,也许我会试一试,至少现在它能工作了。看起来我必须在将玻璃面板添加到框架后将其设置为可见。 - David Kroukamp
1
也许你可以看一下这个快捷方式:https://dev59.com/rV7Va4cB1Zd3GeqPN99J,加1。 - mKorbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接