2010-12-11 16 views
1

J'essaye d'écrire un petit "jeu" qui consiste en un U.F.O. qui vole dans toutes les directions (sur la base des boutons) et explose quand il atteint le bas de l'écran. J'ai 4 classes, dont 2 je ne suis pas autorisé à éditer. Ils sont:Pourquoi ma barre de menu n'apparaîtra-t-elle pas avec ma fenêtre d'affichage?

La fenêtre d'affichage

import javax.swing.*; 
import java.awt.*; 

public class DisplayWindow extends JFrame{ 

    private Container c; 

    public DisplayWindow(){ 
    super("Display"); 
    c = this.getContentPane(); 
    } 

    public void addPanel(JPanel p){ 
    c.add(p); 
    } 

    public void showFrame(){ 
    this.pack(); 
    this.setVisible(true); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

Et le pilote de l'OVNI. J'essaye d'ajouter une barre de menu mais elle ne montrera pas. Qu'est-ce que je fais mal?

Voici ma classe pour dessiner tous les bâtiments et ainsi de suite

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class SaucerPanel extends JPanel implements ActionListener{ 
    JButton quitButton; 
    JButton upButton; 
    JButton leftButton; 
    JButton rightButton; 
    JButton downButton; 
    int xLoc; 
    int yLoc; 
    boolean explode; 

    public SaucerPanel(JMenuBar menuBar){ 
    xLoc = 20; 
    yLoc = 200; 

    explode = false; 

    this.setPreferredSize(new Dimension(850,500)); 
    this.setBackground(Color.white); 
    quitButton = new JButton("Quit"); 
    this.add(quitButton); 
    quitButton.addActionListener(this); 

    downButton = new JButton("Down"); 
    this.add(downButton); 
    downButton.addActionListener(this); 

    upButton = new JButton("Up"); 
    this.add(upButton); 
    upButton.addActionListener(this); 

    leftButton = new JButton("Left"); 
    this.add(leftButton); 
    leftButton.addActionListener(this); 

    rightButton = new JButton("Right"); 
    this.add(rightButton); 
    rightButton.addActionListener(this); 
    } 

    public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.green); 
    g.fillRect(0,440,850,60); 

    g.setColor(Color.gray); 
    g.fillRect(80,420,210,100); 
     g.fillRect(100,410,170,100); 
     g.fillRect(120,400,130,100); 
     g.fillOval(130,350,110,150); 
     int[] aPoints = {170,200,185}; 
     int[] bPoints = {370,370,320}; 
     g.fillPolygon(aPoints,bPoints, 3); 
     g.setColor(Color.black); 
     g.fillRect(135,410,20,100); 
     g.fillRect(175,410,20,100); 
     g.fillRect(215,410,20,100); 

     g.setColor(Color.blue); 
     g.fillRect(460,140,120,360); 

     g.setColor(Color.red); 
     g.fillRect(700,400,100,150); 

     g.setColor(Color.yellow); 
     int[] xPoints = {700,800,750}; 
     int[] yPoints = {400,400,350}; 
     g.fillPolygon(xPoints, yPoints, 3); 

     g.setColor(Color.black); 
     g.fillRect(730,450,40,50); 

     g.setColor(Color.darkGray); 
    if(explode == false){ 
     g.fillOval(xLoc,yLoc,80,40); 
     g.drawString("hovering...",xLoc,yLoc - 10); 
    }else{ 
     for(int i = 0; i < 2000; i++){ 
     int x = (int)(Math.random()*850); 
     int y = (int)(Math.random()*850); 
     g.setColor(Color.orange); 
     g.fillOval(x,y,5,5); 
     int a = (int)(Math.random()*850); 
     int b = (int)(Math.random()*850); 
     g.setColor(Color.red); 
     g.fillOval(a,b,5,5); 
     int c = (int)(Math.random()*850); 
     int d = (int)(Math.random()*850); 
     g.setColor(Color.yellow); 
     g.fillOval(c,d,5,5); 
     } 
    } 
    } 

     public void actionPerformed(ActionEvent e){ 
     if(e.getSource() == quitButton){ 
      System.exit(0); 
     } 
     else if(e.getSource() == downButton){ 
      yLoc += 5; 
      if(yLoc == 400){ 
      explode = true; 
      } 
     } 
     else if(e.getSource() == upButton){ 
      yLoc -= 5; 
     } 
     else if(e.getSource() == leftButton){ 
      xLoc -= 5; 
     } 
     else if(e.getSource() == rightButton){ 
      xLoc += 5; 
     } 

     repaint(); 
     } 
    } 

Et voici ma classe barre de menu

import javax.swing.*; 


public class menuBar extends JFrame{ 

    public menuBar(){ 

    JFrame frame = new JFrame("Menu"); 
    frame.setVisible(true); 
    frame.setSize(850,200); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JMenuBar menuBar = new JMenuBar(); 
    frame.setJMenuBar(menuBar); 

    JMenu file = new JMenu("File"); 
    menuBar.add(file); 
    JMenuItem open = new JMenuItem("Open"); 
    file.add(open); 
    JMenuItem neww = new JMenuItem("New"); 
    file.add(neww); 

    JMenu edit = new JMenu("Edit"); 
    menuBar.add(edit); 
    JMenuItem color = new JMenuItem("Change Color"); 
    edit.add(color); 

    JMenu help = new JMenu("Help"); 
    menuBar.add(help); 
    JMenuItem about = new JMenuItem("About"); 
    help.add(about); 

    frame.setVisible(true); 
    } 
} 
+0

pourquoi avez-vous deux classes de JFrame? Vous voulez certainement ajouter votre JMenuBar à la classe DisplayWindow? – Codemwnci

+0

Oui, c'est ce que je veux faire, mais je ne peux éditer que la classe Menu et la classe SaucerPanel. Comment ferais-je cela? – user539243

Répondre

2

Vous devez faire quelques petits changements.

  • Votre classe MenuBar ne doit pas étendre JFrame, elle doit étendre JMenuBar.

  • Votre classe SaucerDriver doit ajouter votre classe MenuBar et ne pas créer un nouveau JMenuBar, car il est vide et n'est pas renseigné dans votre code.

Votre code devrait ressembler à ceci

import javax.swing.*; 


public class menuBar extends JMenuBar{ 

    public menuBar(){ 

    JMenu file = new JMenu("File"); 
    this.add(file); 
    JMenuItem open = new JMenuItem("Open"); 
    file.add(open); 
    JMenuItem neww = new JMenuItem("New"); 
    file.add(neww); 

    JMenu edit = new JMenu("Edit"); 
    this.add(edit); 
    JMenuItem color = new JMenuItem("Change Color"); 
    edit.add(color); 

    JMenu help = new JMenu("Help"); 
    this.add(help); 
    JMenuItem about = new JMenuItem("About"); 
    help.add(about); 
    } 
} 

et SaucerDriver comme celui-ci

import javax.swing.*; 

public class SaucerDriver{ 

    public static void main(String[] args){ 
    DisplayWindow d = new DisplayWindow(); 
    d.setJMenuBar(new menuBar()); 
    SaucerPanel p = new SaucerPanel(menuBar); 
    d.addPanel(p); 
    d.showFrame(); 
    } 
} 

EDIT: comme vous ne pouvez pas changer le SauceDriver et un objet JMenuBar est passé dans l'objet SaucerPanel, alors vous pouvez manipuler le MenuBar de la classe SaucerPanel. Par conséquent, procédez comme suit ...

public SaucerPanel(JMenuBar menuBar){ 
    setMenuBarItems(menuBar); 
    //...rest of the JPANEL code here 
} 

et ajoutez cette méthode à votre classe SaucerPanel

public void setMenuBarItems(JMenuBar menuBar) { 
    JMenu file = new JMenu("File"); 
    menuBar.add(file); 
    JMenuItem open = new JMenuItem("Open"); 
    file.add(open); 
    JMenuItem neww = new JMenuItem("New"); 
    file.add(neww); 

    JMenu edit = new JMenu("Edit"); 
    menuBar.add(edit); 
    JMenuItem color = new JMenuItem("Change Color"); 
    edit.add(color); 

    JMenu help = new JMenu("Help"); 
    menuBar.add(help); 
    JMenuItem about = new JMenuItem("About"); 
    help.add(about); 
} 
+0

Je ne peux pas éditer le SaucerDriver ou la classe DisplayWindow. Ils m'ont été donnés. – user539243

+0

Ensuite, vous avez deux options. Tout d'abord, vous pouvez créer votre propre classe Main, à la place de SaucerDriver, et ajouter le JMenuBar .... ou, à partir de la classe SaucerPanel, vous pouvez obtenirParent du JPanel (qui sera le JFrame), et y ajouter la barre de menus . – Codemwnci

+0

Je ferai le second puisque je dois utiliser sa classe principale mais je ne suis pas vraiment sûr de ce que .getParent est .. – user539243