如何使用JLabel获得JFrame?尝试时出错



我正在尝试制造扫雷舰。我知道可能有更好的方法可以做到这一点,但这就是我尝试的方式

我的问题出现在gridSquare类中。这个类是一个JLabel,我需要gridSquare包含在其中的框架。我试图获得具有线minesweeperFrame frame = (minesweeperFrame) SwingUtilities.getWindowAncestor(this);的帧。我遇到的问题是frame为null,并且从未设置为gridSquares Frame。有什么办法解决这个问题吗。

Main.java

public class Main {
public static void main(String[] args) {
minesweeperFrame frame = new minesweeperFrame();
}
}

gridSquare.java

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Objects;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.Border; 
public class gridSquare extends JLabel implements MouseListener{

Boolean isBomb = false;
int gridNum;
int n1,n2,n3,n4,n6,n7,n8,n9;
int bombNumber;
minesweeperFrame frame = (minesweeperFrame) SwingUtilities.getWindowAncestor(this);


gridSquare(int gridNum){

this.gridNum = gridNum;

n1 = gridNum - 10 - 1; //Top left 
n2 = gridNum - 10 ; //Top center
n3 = gridNum - 10 + 1; //Top Left
n4 = gridNum - 1;//center left
n6 = gridNum + 1;//center right
n7 = gridNum + 10 -1;//Bottom Left
n8 = gridNum + 10; //Bottom Center
n9 = gridNum + 10 + 1; //Bottom Right
int neighbors[] = {n1,n2,n3,n4,n6,n7,n8,n9};

try {
//get the bomb number
for(int i:neighbors) {
if(frame.getSquares().get(i).getIsBomb()) { // if any neighbor is a bomb increase bombNumber ---------- frame.getSquares().get(i).getIsBomb()
bombNumber++;
}
System.out.println("WORKS");
}
}
catch(Exception e){
System.out.println(e);
}



setText("");

setHorizontalAlignment(JLabel.CENTER);
setVerticalAlignment(JLabel.CENTER);
setFont(new Font("Copperplate Gothic Bold",Font.PLAIN,20));
setForeground(new Color(0x000000)); //set font color CHANGE FOR EACHER NUMBER
setSize(50,50);

Border border = BorderFactory.createLineBorder(Color.darkGray,5);
setBorder(border);

setBackground(new Color(0xd3d3d3)); //set background color ----- change to #424242 after clicked
setOpaque(true);//display background color

addMouseListener(this);



}

public Boolean getIsBomb() {
return isBomb;
}

public void setIsBomb(Boolean isBomb) {
this.isBomb = isBomb;
}



@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getButton() == MouseEvent.BUTTON1) {
setText("Left Click!");

if(isBomb) {
setText("bomb");
}



}
if(e.getButton() == MouseEvent.BUTTON3) {
setText("Flag");
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

}

mineSeeperFrame.java

import java.awt.GridLayout;
import java.awt.color.*;
import java.util.ArrayList;
import javax.swing.*;

public class minesweeperFrame extends JFrame{

private final int numColumns = 10;
private int numRows = 8;

int numBombs = 0;

ArrayList<gridSquare> squares = new ArrayList<gridSquare>();

minesweeperFrame(){

setTitle("Minesweeper");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000,850);
setResizable(false);
setLayout(new GridLayout(numRows,numColumns,1,1));
setVisible(true);


//Fill Arraylist and add to frame
for(int i = 0; i < 80;i++) {
squares.add(new gridSquare(i));
add(squares.get(i));
}

//AddBombs
while(numBombs < 10) {
squares.get((int) (Math.random()*80)).setIsBomb(true);
numBombs++;
}



}

public ArrayList<gridSquare> getSquares() {
return squares;
}

public int getGridRows() {
return numRows;
}
public int getGridColumns() {
return numColumns;
}



}

初始化期间不能执行此操作:

minesweeperFrame frame = (minesweeperFrame) SwingUtilities.getWindowAncestor(this);

组件正在创建中,但尚未添加到框架中,因此您将获得null。

此外,你直接将网格正方形添加到框架中,这是错误的,你必须将其添加到内容窗格中,请阅读:

  • https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html
  • https://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

最新更新