2012-06-26 55 views
2

我一直在努力实现我在游戏HUD游戏的一个GlassPane,但现在我不能似乎得到了JFrame设置我的GlassPane作为自己的我,已经使用setGlassPane()和我一直在阅读几个例子,试图找到我的错误,但没有。所以我写了一个SSCCE,证明我的问题。我有一个JFrame,我添加了一个标签为“TESTIING”的Jpanel,然后启动我的galss窗格并在我的框架实例上调用setGlassPane()。我的玻璃面板有MouseListener,一个JPanel和2 JLabels,以及重写paint()但是MouseListener不会工作的paint()不会显示我的标签是不存在(所以基本上我GlassPane没有被设置为我的帧新GlassPane) -玻璃面板没有显示出来的JFrame的

/*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

在使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); 
3
  • 好像是玻璃面板是correcty创建的,但玻璃面板以其他方式覆盖了轻量级的JComponent背后,隐藏的是

  • 玻璃面板没有实施任何布局管理,您必须重量级Swing或AWT焦耳/组件设置适当的布局管理

  • 测试将非不透明的JLabel一些背景

  • 我为爱玻璃面板,但你可以使用基于JLayer(Java7)在JXLayer(的Java6)或OverlayLayout,作为最简单的方式

+0

有趣的,也许我会尝试至少现在我得到它的工作,似乎我必须将它添加到我的框架后,将glasspane设置为可见。 –

+1

[也许你已经看过快捷方式](+1)(http://stackoverflow.com/questions/8715807/layering-multiple-glasspanes-in-a-root-container),+1 – mKorbel