2017-07-26 40 views
0

我试图创建一个简单的扫雷游戏(用户可自定义)。 在写它,我试图通过使用NetBeans设计视图和进入该代码来创建的JButtons网格(经由JButton阵列)成JPanel在设计视图中创建的Netbeans数组无法访问

JButton mines[] = new JButton [gridXVal*gridYVal]; 
mineGrid.setLayout(new java.awt.GridLayout(gridXVal,gridYVal)); 
for (int i = 0 ; i < mines.length ; i++) 
     { 
      mines [i] = new JButton(" "); 
      mines [i].setActionCommand ("" + i); 
      mines[i].addActionListener(listener); 
      //mines [i].setBorder (null); 
      //mines [i].setBorderPainted (false); 
      mineGrid.add (mines [i]); 
} 

后来,当我通过访问它的方法中的

ImageIcon icon = new ImageIcon(mineCounter+".png"); 
mines[a].setIcon(icon); 

它给了我一个错误,说"cannot find symbol"。我尝试配置JPanel以便它是公开的,但我仍然无法在我的方法中的预生成代码之外进行编辑。

这是我得到的,当我点击一个按钮尝试它的图像设置一些错误:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: 
    Uncompilable source code - Erroneous sym type: <any>.setIcon 
    at gameScreen.clickDraw(gameScreen.java:227) 
    at gameScreen$3.actionPerformed(gameScreen.java:170) 

任何帮助将不胜感激!

+2

我的“猜测”是,'mines'不到本地定义上下文到它使用的方法,使其他部分无法访问代码 – MadProgrammer

+0

有没有什么办法可以让它在全局访问?它是用netbeans中的设计屏幕创建的 –

+0

是的,但是如何需要更多的上下文 – MadProgrammer

回答

1

我假定这部分代码:

mineGrid.setLayout(new java.awt.GridLayout(1, 0)); 
JButton mines[] = new JButton [gridXVal*gridYVal]; 
mineGrid.setLayout(new java.awt.GridLayout(gridXVal,gridYVal)); 
for (int i = 0 ; i < mines.length ; i++) 
{ 
    mines [i] = new JButton(" "); 
    mines [i].setActionCommand ("" + i); 
    mines[i].addActionListener(listener); 
    //mines [i].setBorder (null); 
    //mines [i].setBorderPainted (false); 
    mineGrid.add (mines [i]); 
} 

是由您通过Netbeans中的“代码”编辑选项之一手动输入的。

你需要采取JButton mines[] = new JButton [gridXVal*gridYVal];和在类级别声明并修改“自定义代码”初始化这个变量...

private JButton mines[]; 

private void initComponents() { 
    //... 
    mineGrid.setLayout(new java.awt.GridLayout(1, 0)); 
    JButton mines[] = new JButton [gridXVal*gridYVal]; 
    mineGrid.setLayout(new java.awt.GridLayout(gridXVal,gridYVal)); 
    for (int i = 0 ; i < mines.length ; i++) 
    { 
     mines [i] = new JButton(" "); 
     mines [i].setActionCommand ("" + i); 
     mines[i].addActionListener(listener); 
     //mines [i].setBorder (null); 
     //mines [i].setBorderPainted (false); 
     mineGrid.add (mines [i]); 
    } 
    //... 
}// </editor-fold>  
0

这是NetBeans生成的代码,包括地雷JButton数组。

private void initComponents() { 

     ctText = new javax.swing.JLabel(); 
     ct = new javax.swing.JLabel(); 
     jLabel1 = new javax.swing.JLabel(); 
     ct1 = new javax.swing.JLabel(); 
     testBtn = new javax.swing.JButton(); 
     jSeparator1 = new javax.swing.JSeparator(); 
     mineGrid = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     ctText.setText("BombCount:"); 

     ct.setText("###"); 

     jLabel1.setText("Time:"); 

     ct1.setText("000"); 

     testBtn.setText("Reset"); 
     testBtn.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       testBtnActionPerformed(evt); 
      } 
     }); 

     mineGrid.setLayout(new java.awt.GridLayout(1, 0)); 
     JButton mines[] = new JButton [gridXVal*gridYVal]; 
     mineGrid.setLayout(new java.awt.GridLayout(gridXVal,gridYVal)); 
     for (int i = 0 ; i < mines.length ; i++) 
     { 
      mines [i] = new JButton(" "); 
      mines [i].setActionCommand ("" + i); 
      mines[i].addActionListener(listener); 
      //mines [i].setBorder (null); 
      //mines [i].setBorderPainted (false); 
      mineGrid.add (mines [i]); 
     } 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(24, 24, 24) 
       .addComponent(ctText) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(ct) 
       .addGap(53, 53, 53) 
       .addComponent(testBtn) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 68, Short.MAX_VALUE) 
       .addComponent(jLabel1) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(ct1) 
       .addGap(45, 45, 45)) 
      .addComponent(jSeparator1) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(mineGrid, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(ctText) 
        .addComponent(ct) 
        .addComponent(jLabel1) 
        .addComponent(ct1) 
        .addComponent(testBtn)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(mineGrid, javax.swing.GroupLayout.DEFAULT_SIZE, 251, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 

     pack(); 
    }// </editor-fold>       

我尝试访问数组中的clickDraw方法:

public void clickDraw(int a) { 
     System.out.println(Arrays.deepToString(mineField)); 
     int row = a/gridXVal; 
     int col = a % gridYVal; 
     int mineCounter = 0; 

     if (mineField[row][col] == 1) { 
      loseGame(); 
     } 
     if (mineField[row + 1][col] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row - 1][col] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row][col + 1] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row][col - 1] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row + 1][col + 1] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row + 1][col - 1] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row - 1][col + 1] == 1) { 
      mineCounter++; 
     } 
     if (mineField[row - 1][col - 1] == 1) { 
      mineCounter++; 
     } 
     ImageIcon icon = new ImageIcon(mineCounter+".png"); 
     mines[a].setIcon(icon); 
     /*if (mineCounter ==0) 
     adjacentDraw(a);*/ 
    } 

调用该方法在一个ActionListener,监听器:

ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() instanceof JButton) { 
       int clickedTile = Integer.parseInt(e.getActionCommand()); 
       clickDraw(clickedTile); 
      } 
     } 
    };