3

ゲームのゲーム内 HUD にを実装しようとしてきましたGlassPaneが、今のところ を独自のものとしてJFrame設定することができないようです。使用しており、間違いを見つけようとしていくつかの例を読んでいますが、なし。そこで、私の問題を示すSSCCEを書きました。「TESTIING」というラベルの付いた Jpanel を追加する JFrame があります。次に、galss ペインを開始し、フレーム インスタンスで setGlassPane() を呼び出します。私のGlassPane には a 、 a 、 2 、および overridenがありますが、表示されず、ラベルが表示されません (基本的に、私のフレームは new として設定されていません)-GlassPanesetGlassPane()MouseListenerJPanelJLabelspaint()MouseListenerpaint()GlassPaneGlassPane

/*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) {
    }
}

ありがとうございます。

4

3 に答える 3

4

表示する前に、まずカスタムGlassPaneをフレームとして追加する必要があるようです。ここでのこのコードは機能しているようです。GlassPaneGlassPane

    //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);
于 2012-06-26T14:15:47.933 に答える
2

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

グラスペインを JRootPane に追加した後、グラスペインを可視に設定する必要があります。

于 2012-06-26T14:26:15.920 に答える
1
  • Glasspane は正しく作成されているようですが、Glasspane は軽量の JComponent のみをオーバーレイし、それ以外の場合は背後にあり、重い Swing または AWT J/Component に隠されています

  • Glasspane は LayoutManager を実装していません。適切な LayoutManager を設定する必要があります

  • テストのために、いくつかの背景を持つ非不透明な JLabel を置きます

  • 私は Glasspane が大好きですが、最も簡単な方法として、JXLayer (Java6) または OverlayLayout に基づく JLayer (Java7) を使用できます。

于 2012-06-26T14:27:36.200 に答える