java吧 关注:1,243,559贴子:12,719,003
  • 9回复贴,共1

求助。。菜单项被遮住了

只看楼主收藏回复

本人编写的扫雷程序,但运行时菜单项被遮住了,那位高手告诉下该怎样解决,非常感谢。。。。
//Bomb.java
import javax.swing.JButton;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Bomb extends JButton {
public int num_x,num_y;        //第几号方块
public int BombRoundCount;     //周围雷数
public boolean isBomb;         //是否为雷
public boolean isClicked;      //是否被点击
public int BombFlag;           //探雷标记
public boolean isRight;        //是否点击右键
public Bomb(int x,int y)
   {
    BombFlag = 0;
    num_x = x;
    num_y = y;
    BombRoundCount = 0;
    isBomb = false;
    isClicked = false;
    isRight = false;
   }
}
//MainBomb.java
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainBomb extends JFrame implements ActionListener,MouseListener{
public JTextField text;
   public Label nowBomb,setBomb;
   public int BlockNum,BombNum,BNum;                                             //当前方块数当前雷数
   public Icon icon_bomb = new ImageIcon("Bomb.gif");                           //踩雷
   public Icon icon_bomb_big = new ImageIcon("bomb_big.gif");                   //踩雷标记
   public Icon icon_flag = new ImageIcon("flag.gif");                           //雷标记
   public Icon icon_question = new ImageIcon("question.gif");                   //疑惑是否有雷
   public JButton start = new JButton(" 开始 ");
   public Panel MenuPamel = new Panel();
   public Panel mainPanel = new Panel();
   public Bomb[][] bombButton;
    public JMenuBar mb;
      public JMenuItem lowl,middlel,highl,helpitem;
      public JMenu game,help;
  
   /*界面设计*/
  
   public MainBomb()



1楼2010-06-07 18:42回复
       {
        super("扫雷   Aaron2004制作 2004.8 ");
        mb=new JMenuBar();
             //mb.setLightWeightPopupEnabled(false);
             game = new JMenu("游戏");
             help = new JMenu("帮助");
             mb.add(game);
             mb.add(help);
             lowl = new JMenuItem("初级");
             middlel = new JMenuItem("中级");
             highl = new JMenuItem("高级");
             game.add(lowl);
             game.add(middlel);
             game.add(highl);
            
             helpitem = new JMenuItem("关于扫雷");
             help.add(helpitem);
             //lowl.addActionListener(this);
             //middlel.addActionListener(this);
             //highl.addActionListener(this);
             //helpitem.addActionListener(this);
             setLayout(new BorderLayout());
             add(mb,"North");
             //setJPopupMenu(mb);
             this.getContentPane().add(mb,BorderLayout.NORTH);
        BlockNum = 64;
        BombNum = 10;
        BNum=10;
        JPanel c=new JPanel();
        c.setBackground(Color.orange);
        c.setLayout(new BorderLayout());
      
        nowBomb = new Label("当前雷数"+"   "+BombNum+"");
       
        c.add(nowBomb,"South");
       
        mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum) , (int)Math.sqrt(BlockNum)) );
        bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][];
        for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)
        {
         bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ];
        }
        for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )
         for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ )
         {
          bombButton[ i ][ j ]=new Bomb(i,j);
          bombButton[ i ][ j ].setForeground( Color.gray);
          bombButton[ i ][ j ].addActionListener(this);
    


    2楼2010-06-07 18:42
    回复
            bombButton[ i ][ j ].addMouseListener(this);
           }
          for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )
           for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ )
            mainPanel.add(bombButton[ i ][ j ]);
          c.add(mainPanel,"Center");
      this.getContentPane().add(c,BorderLayout.CENTER);
          startBomb();
          setSize(350,400);
          setLocation(350,200);
          setResizable(false);
         
          addWindowListener(new WindowAdapter(){
              public void windowClosing(WindowEvent e){
                  System.exit(0);
              }
          });
         
          lowl.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  BNum=10;
                  replay();
              }
          });
          middlel.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  BNum=15;
                  replay();
              }
          });
          highl.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  BNum=20;
                  replay();
              }
          });
          helpitem.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  //new Help(this,"关于扫雷");
              }
          });
         
         }
        
         /*布雷*/
        
         public void startBomb()
         {
         
          for(int i=0;i<BombNum;i++)
          {
           int x =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));  
           int y =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));
          
           if(bombButton[ x ][ y ].isBomb==true)
            i--;//再重新来一次.呵呵
           else
      


      3楼2010-06-07 18:42
      回复
              bombButton[ x ][ y ].isBomb=true ;
            }
           }
          
           /*重新开始*/
          
           public void replay()
           {
            BombNum=BNum;
            nowBomb.setText("当前雷数"+"   "+BombNum+"");
            for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)
             for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++)
             {
              bombButton[ i ][ j ].isBomb=false;
              bombButton[ i ][ j ].isClicked=false;
              bombButton[ i ][ j ].setEnabled(true);
              bombButton[ i ][ j ].setText("");
              bombButton[ i ][ j ].setIcon(null);
             }
            startBomb();
           }
          
           /*是否挖完了所有的雷*/
          
           public void isWin()
           {
            int findBomb=0;   //找到的地雷数   
            for(int i = 0;i < (int)Math.sqrt(BlockNum) ; i++)
            
             for(int j = 0;j < (int)Math.sqrt(BlockNum ); j++)
              {
               if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight == true)
                findBomb++;
              }
             if( findBomb == BNum )
             {
              JOptionPane msg = new JOptionPane();
              JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!","您胜利了",2);
             }
            }
           
            /*计算方块周围雷数 */
           
            public void CountRoundBomb()
            {
             for (int i = 0; i < (int)Math.sqrt(BlockNum); i++) {
              for (int j = 0; j < (int)Math.sqrt(BlockNum); j++) {
               int count = 0;
               //当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
               if (bombButton[ i ][ j ].isBomb != true) {
                if ( (i - 1 >= 0) && (j - 1 >= 0)) {
                 if (bombButton[i - 1][j - 1].isBomb == true) {
                  count += 1; //检测左上方空格是否是地雷
                 }
                }
                if ( (i - 1 >= 0)) {
                 if (bombButton[i - 1][ j ].isBomb == true) {
        


        4楼2010-06-07 18:42
        回复
                    count += 1; //检测上方空格是否为地雷
                   }
                  }
                  if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
                   if (bombButton[i - 1][j + 1] .isBomb == true) {
                    count += 1; //检测右上方是否为地雷
                   }
                  }
                  if ( (j - 1 >= 0)) {
                   if (bombButton[ i ][j - 1] .isBomb == true) {
                    count += 1; //检测左边是否为地雷
                   }
                  }
                  if ( (i >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
                   if (bombButton[ i ][j + 1].isBomb == true) {
                    count += 1; //右边
                   }
                  }
                  if ( (j - 1 >= 0) && (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
                   if (bombButton[i + 1][j - 1].isBomb == true) {
                    count += 1; //左下
                   }
                  }
                  if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
                   if (bombButton[i + 1][ j ].isBomb == true) {
                    count += 1; //下
                   }         if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) && (i + 1 <= Math.sqrt(BlockNum)-1)) {
                    if (bombButton[i + 1][j + 1].isBomb == true) {
                     count += 1; //右下
                    }
                   }
                   bombButton[ i ][ j ].BombRoundCount = count;
                  }
                 }
                }
               }
              }
              
               /**当选中的位置为空,则翻开周围的地图**/
              
               public void isNull(Bomb[][] bombButton,Bomb ClickecButton)
               {
                int i,j;
          


          5楼2010-06-07 18:42
          回复
                  i=ClickecButton.num_x;
                  j=ClickecButton.num_y;
                 
                  if (ClickecButton.isBomb==true) {
                  
                  }
                  else {
                  
                   if ( (i - 1 >= 0) && (j - 1 >= 0)) { //检测左上方空格是否是空
                    if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j - 1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) {
                     bombButton[i - 1][j - 1].setText((bombButton[i - 1][j - 1].BombRoundCount)+"");
                     bombButton[i - 1][j - 1].setEnabled(false);
                     bombButton[i - 1][j - 1].isClicked=true;
                     if(bombButton[i - 1][j - 1].BombRoundCount==0)
                         isNull(bombButton,bombButton[i - 1][j - 1]);
                    }
                   }
                  
                   if ( (i - 1 >= 0)) { //检测上方空格是否为空
                    if (bombButton[i - 1][ j ] .isBomb == false && bombButton[i - 1][ j ].isClicked == false && bombButton[i - 1][ j ].isRight == false) {
                     bombButton[i - 1][ j ].setText((bombButton[i - 1][ j ].BombRoundCount)+"");
                     bombButton[i - 1][ j ].setEnabled(false);
                     bombButton[i - 1][ j ].isClicked=true;
                     if(bombButton[i - 1][j].BombRoundCount==0)
                         isNull(bombButton,bombButton[i - 1][j]);
                    }
                   }
                   if ( (i - 1 >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右上方是否为空
                    if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j + 1].isClicked == false && bombButton[i - 1][j + 1].isRight == false) {
                     bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+"");
                     bombButton[i - 1][j + 1].setEnabled(false);
                     bombButton[i - 1][j + 1].isClicked=true;
                     if(bombButton[i - 1][j + 1].BombRoundCount==0)
                         isNull(bombButton,bombButton[i - 1][j + 1]);
            


            6楼2010-06-07 18:42
            回复
                      }
                     
                     }
                     if ( (j - 1 >= 0)) { //检测左边是否为空
                      if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j - 1].isClicked == false && bombButton[ i ][j - 1].isRight == false) {
                       bombButton[ i ][j - 1].setText((bombButton[ i ][j - 1].BombRoundCount)+"");
                       bombButton[ i ][j - 1].setEnabled(false);
                       bombButton[ i ][j - 1].isClicked=true;
                       if(bombButton[i][j - 1].BombRoundCount==0)
                           isNull(bombButton,bombButton[i][j - 1]);
                      }
                     
                     }
                     if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右边空格是否是空
                      if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j + 1].isClicked == false && bombButton[ i ][j + 1].isRight == false) {
                       bombButton[ i ][j + 1].setText((bombButton[ i ][j + 1].BombRoundCount)+"");
                       bombButton[ i ][j + 1].setEnabled(false);
                       bombButton[ i ][j + 1].isClicked=true;
                       if(bombButton[i][j + 1].BombRoundCount==0)
                           isNull(bombButton,bombButton[i][j + 1]);
                      }
                     }
                     if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测左下空格是否是空
                      if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j - 1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) {
                       bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+"");
                       bombButton[i + 1][j - 1].setEnabled(false);
                       bombButton[i + 1][j - 1].isClicked=true;
                       if(bombButton[i + 1][j - 1].BombRoundCount==0)
                           isNull(bombButton,bombButton[i + 1][j - 1]);
                      }
                     }
                     if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测下边空格是否是空
              


              7楼2010-06-07 18:42
              回复
                        if (bombButton[i + 1][ j ].isBomb == false && bombButton[i + 1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) {
                         bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+"");
                         bombButton[i + 1][ j ].setEnabled(false);
                         bombButton[i + 1][ j ].isClicked=true;
                         if(bombButton[i + 1][j].BombRoundCount==0)
                             isNull(bombButton,bombButton[i + 1][j]);
                        }
                       }
                       if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右下边空格是否是空
                        if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j + 1].isClicked == false && bombButton[i + 1][j + 1].isRight == false) {
                         bombButton[i + 1][j + 1].setText((bombButton[i + 1][j + 1].BombRoundCount)+"");
                         bombButton[i + 1][j + 1].setEnabled(false);
                         bombButton[i + 1][j + 1].isClicked=true;
                         if(bombButton[i + 1][j + 1].BombRoundCount==0)
                             isNull(bombButton,bombButton[i + 1][j + 1]);
                        }
                       }
                     
                      
                      }
                     }
                    
                    
                     public void actionPerformed(ActionEvent e)
                     {       
                     
                      CountRoundBomb();//计算方块周围雷数
                     
                      if(((Bomb)e.getSource()).isBomb==false && ((Bomb)e.getSource()).isClicked == false)
                      {
                       ((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount )+"");
                       ((Bomb)e.getSource()).isClicked=true;
                       ((Bomb)e.getSource()).setIcon(null);
                       ((Bomb)e.getSource()).setEnabled(false);
                       if((((Bomb)e.getSource()).BombRoundCount) == 0)
                        isNull(bombButton,(Bomb)e.getSource());
                       isWin();
                      }
                      else if(((Bomb)e.getSource()).isBomb == true)
                


                8楼2010-06-07 18:42
                回复
                        {
                        
                         for(int i=0;i<(int)Math.sqrt(BlockNum);i++)
                          for(int j=0;j<(int)Math.sqrt(BlockNum);j++)
                          {
                           if(bombButton[ i ][ j ].isBomb == true)
                            bombButton[ i ][ j ].setIcon(icon_bomb);
                          }
                        
                         ((Bomb)e.getSource()).setIcon(icon_bomb_big);
                        
                         JOptionPane msg = new JOptionPane();
                         JOptionPane.showMessageDialog(this,"你踩到地雷了,按确定重来","你踩到地雷了",2);
                         replay();
                        }
                       }
                      
                       public void mouseClicked(MouseEvent e)
                       {
                        Bomb bombSource = (Bomb)e.getSource();
                        boolean right = SwingUtilities.isRightMouseButton(e);
                       
                        if((right == true) && (bombSource.isClicked == false))
                        {
                         bombSource.BombFlag = (bombSource.BombFlag + 1)%3;
                         if(bombSource.BombFlag == 1)
                         {
                         
                          if(BombNum > 0 && bombSource.isRight == false ){
                           bombSource.setIcon(icon_flag);
                           bombSource.isRight = true;
                           BombNum--;
                          }
                          isWin();
                          nowBomb.setText("当前雷数"+"   "+BombNum+"");
                         }
                         else if(bombSource.BombFlag == 2)
                         {
                         
                          if( (BombNum !=0 ) ||(BombNum ==0 &&(bombSource.getIcon()==icon_flag)))
                           BombNum++;
                          bombSource.setIcon(icon_question);
                          nowBomb.setText("当前雷数"+"   "+BombNum+"");
                         }
                         else if(bombSource.BombFlag == 0)
                         {  
                          bombSource.setIcon(null);
                          bombSource.isRight = false;
                         }
                        }
                       }
                      
                       public void mouseEntered(MouseEvent e)
                       {}
                       public void mouseReleased(MouseEvent e)
                       {}
                       public void mouseExited(MouseEvent e)
                       {}
                       public void mousePressed(MouseEvent e)
                       {} }
                  //main.java
                  public class main { /**
                     * @param args
                     */
                  public static void main(String[] args) {
                     // TODO Auto-generated method stub
                    
                     (new MainBomb()).show(); }}
                  


                  9楼2010-06-07 18:42
                  回复
                    菜单项被遮住,楼主我最近也碰到这个问题,不知道楼主解决了没有?分享下最后的触屏办法


                    10楼2013-10-08 21:32
                    回复