2012-06-26 53 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