【问题标题】:GlassPane is not showing up on JFrameGlassPane 未显示在 JFrame 上
【发布时间】:2012-06-27 20:38:37
【问题描述】:

我一直在尝试为我的游戏的游戏内 HUD 实现 GlassPane,但现在我似乎无法让 JFrame 将我的 GlassPane 设置为自己的我;我使用了 setGlassPane()我一直在阅读一些例子,试图找出我的错误,但什么也没有。所以我写了一个SSCCE 来证明我的问题。我有一个 JFrame,我向其中添加了一个带有标签“TESTIING”的 Jpanel,然后我启动我的 galss 窗格并在我的框架实例上调用 setGlassPane()。我的 GlassPane 有一个 MouseListener、一个 JPanel 和 2 个 JLabels,还有一个覆盖 paint() 但是 MouseListener 不会工作 paint() 不会显示并且我的标签不存在(所以基本上我的 GlassPane没有被设置为我的新框架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) {
    }
}

谢谢。

【问题讨论】:

    标签: java swing jframe paintcomponent glasspane


    【解决方案1】:

    看来您必须先将自定义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】:

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

      您需要在将玻璃窗格添加到 JRootPane 后将其设置为可见。

      【讨论】:

      • 哈哈,是的,谢谢,在测试各种方法时,我将 setGlassPane(m_glasspane); 方法移到了 m_glasspane.setVisible(true); 上方,如果我只是阅读文档,它会更容易工作:P
      【解决方案3】:
      • 似乎正确创建了 Glasspane,但 Glasspane 仅覆盖轻量级 JComponent,否则在后面,隐藏为​​重量级 Swing 或 AWT J/Component

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

      • 用于测试放置带有一些背景的不透明 JLabel

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

      【讨论】:

      • 很有趣,也许我会尝试一下,至少现在我得到它的工作似乎我必须在添加我的框架后将玻璃窗格设置为可见。
      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2022-01-12
      • 2012-10-17
      • 2014-11-07
      相关资源
      最近更新 更多