2010-12-11 9 views
1

私はU.F.O.で構成された小さな「ゲーム」を書くことを試みています。 (ボタンに基づいて)すべての方向に飛んで、画面の下部に当たると爆発します。私には4つのクラスがあり、うち2つは編集できません。彼らは以下のとおりです。メニューバーが表示ウィンドウでポップアップしないのはなぜですか?

表示窓

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); 
    } 
} 

そしてUFOのドライバ。

import javax.swing.*; 

public class SaucerDriver{ 

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

メニューバーを追加しようとしていますが、表示されません。私は間違って何をしていますか?

は、ここに私のすべての建物を描画するためのクラスと、ここでその他もろもろ

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(); 
     } 
    } 

そして、私のメニューバークラスあなたはいくつかの小さな変更を加える必要が

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

は、なぜあなたは2つのJFrameのクラスを持っているか、以下の...

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

を行うと、あなたのSaucerPanelクラスにこのメソッドを追加しますか?もちろん、JMenuBarをDisplayWindowクラスに追加したいだけですか? – Codemwnci

+0

はい、それはやりたいことですが、MenuクラスとSaucerPanelクラスのみを編集できます。どうすればいい? – user539243

答えて

2

です。

  • MenuBarクラスはJFrameを拡張してはならず、JMenuBarを拡張する必要があります。

  • SaucerDriverクラスは、MenuBarクラスを追加する必要があります。新しいJMenuBarは空であり、コードのどこにでも配置されないため、作成しないでください。

この

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のようにあなたのコードは、この

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); 
    } 
} 

とSaucerDriverのようになります。あなたはSauceDriverとJMenuBarのオブジェクトを変更することはできませんようにSaucerPanelオブジェクトに渡され、 SaucerPanelクラスからMenuBarを操作できます。したがって、

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

SaucerDriverクラスまたはDisplayWindowクラスを編集することはできません。彼らは私に与えられた。 – user539243

+0

次に、2つのオプションがあります。まず、SaucerDriverの代わりに独自のMainクラスを作成し、JMenuBar ....を追加するか、SaucerPanelクラスからJPanel(JFrameになります)のgetParentを作成し、そこにメニューバーを追加することができます。 – Codemwnci

+0

メインクラスを使用する必要があるため、2番目のクラスを作成しますが、.getParentが何であるかはわかりません。 – user539243

関連する問題