Почему не отображается строка меню с окном отображения? - PullRequest
1 голос
/ 12 декабря 2010

Я пытаюсь написать небольшую «игру», которая состоит из НЛО, который летает во всех направлениях (на основе кнопок) и взрывается, когда он попадает в нижнюю часть экрана.У меня есть 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);
  }
}

И драйвер для НЛО.

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

1 Ответ

2 голосов
/ 12 декабря 2010

Вам необходимо внести несколько небольших изменений.

  • Ваш класс MenuBar не должен расширять JFrame, он должен расширять JMenuBar.

  • ВашКласс SaucerDriver должен добавить ВАШ класс MenuBar, а не создавать новый JMenuBar, поскольку он пустой и не заполняется где-либо в вашем коде.

Ваш код должен выглядеть следующим образом

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, как это

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

РЕДАКТИРОВАТЬ: так как вы не можете изменить SauceDriver И объект JMenuBar передается в объект SaucerPanel, то вы можете управлять MenuBar из класса SaucerPanel.Поэтому сделайте следующее ...

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

и добавьте этот метод в свой класс 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...