2016-05-18 12 views
1

Ich bin neu in Java und arbeite gerade an einem Spiel. Im Wesentlichen gibt es aufsteigende Blasen, und der Benutzer muss sie platzen lassen, indem er die Maus über sie bewegt.Ein transparentes JPanel über einen JFrame machen

Ich habe bereits eine Animation auf dem JFrame gemacht und ich muss ein JPanel für einen MouseMotionListener oben hinzufügen. Wenn ich jedoch das JPanel über dem JFrame hinzufüge (selbst wenn setOpaque auf false gesetzt ist), kann ich meine Animation darunter nicht sehen. Sie können meinen Code unten sehen. Wenn Sie Codierungsfehler finden, lassen Sie es mich wissen.

Ich habe zwei Lösungen im Hinterkopf, entweder in JPanel animieren (was ich nicht weiß, wie zu tun), oder JPanel transparent machen.

Spielklasse:

public class Game extends JPanel{ 

    public static final int WINDOW_WIDTH = 600; 
    public static final int WINDOW_HEIGHT = 400; 

    private boolean insideCircle = false; 
    private static boolean ifPaused = false; 
    private static JPanel mainPanel; 
    private static JLabel statusbar; 
    private static int clicks = 0; 
    //Creates a Bubbles object Array 
    Bubbles[] BubblesArray = new Bubbles[5]; 

    public Game() { 

    //initializes bubble objects 
    for (int i = 0; i < BubblesArray.length; i++) 
     BubblesArray[i] = new Bubbles(); 
    } 

public void paint(Graphics graphics) { 

    //makes background white 
    graphics.setColor(Color.WHITE); 
    graphics.fillRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 

    //paints square objects to the screen 
    for (Bubbles aBubblesArray : BubblesArray) { 
    aBubblesArray.paint(graphics); 
    } 
} 

public void update() { 

//calls the Square class update method on the square objects 
for (Bubbles aBubblesArray : BubblesArray) aBubblesArray.update(); 
} 

    public static void main(String[] args) throws InterruptedException { 
    statusbar = new JLabel("Default"); 
    mainPanel = new JPanel(); 
    mainPanel.setOpaque(false); 
    mainPanel.setBackground(new Color(0,0,0,0)); 
    mainPanel.setVisible(true); 
    mainPanel.addMouseMotionListener(new MouseAdapter() { 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      statusbar.setText(String.format("Your mouse is at %d, %d", e.getX(), e.getY())); 
      } 

     public void mouseExited(MouseEvent e){ 
     ifPaused = true; 
     } 

     public void mouseEntered(MouseEvent e){ 
     ifPaused = false; 
     } 

    }); 

    Game game = new Game(); 
    JFrame frame = new JFrame(); 

    frame.add(game); 
    frame.add(mainPanel); 



    frame.add(statusbar, BorderLayout.SOUTH); 
    frame.setVisible(true); 
    frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setTitle("Bubble Burst"); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 

    while (true) { 
     if (!ifPaused){ 
     game.update(); 
     game.repaint(); 
     Thread.sleep(5); 
     } 
    } 
}  
} 
+0

Bevorzugen 'paintComponent' zu' paint', auch sicherstellen, dass Sie die Methoden Super Implementierung aufrufen (dh 'super.paint (Grafik) ') Die nächste Frage wäre, warum nicht den Zuhörer zum' Game' Panel hinzufügen? – MadProgrammer

Antwort

0

Ihr game Panel zeigt nicht auf, weil Sie hinzufügen zwei Komponenten auf die gleiche Stelle eines BorderLayout (bei BorderLayout.CENTER). Daher wird mainPanel nicht "über" game hinzugefügt, es ersetzt es. Das sagte:

Es scheint nicht, dass Ihre mainPanel eigentlich alles außer dem Hören für Mausbewegung tut. Könnten Sie nicht nur die MouseAdapter zu Ihrem game Objekt hinzufügen, da es JPanel wie folgt erweitert:

game.addMouseMotionListener(new MouseAdapter() { 
    @Override 
    public void mouseMoved(MouseEvent e) { 
     statusbar.setText(String.format("Your mouse is at %d, %d", e.getX(), e.getY())); 
    } 

    public void mouseExited(MouseEvent e){ 
     ifPaused = true; 
    } 

    public void mouseEntered(MouseEvent e){ 
     ifPaused = false; 
    } 
}); 
+0

Es hat funktioniert, vielen Dank! –