程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 JLabel 获取 JFrame?尝试时出错大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用 JLabel 获取 JFrame?尝试时出错?

开发过程中遇到如何使用 JLabel 获取 JFrame?尝试时出错的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 JLabel 获取 JFrame?尝试时出错的解决方法建议,希望对你解决如何使用 JLabel 获取 JFrame?尝试时出错有所启发或帮助;

我正在尝试制作扫雷艇。我知道可能有更好的方法来做到这一点,但我正在尝试这样做。

我的问题出在 grIDSquare 类中。这个类是一个 JLabel,我需要包含 grIDSquare 的框架。我尝试使用 @H_345_5@minesweeperFrame frame = (minesweeperFramE) SwingUtilitIEs.getwindowAncestor(this); 行获取框架。我遇到的问题是 frame 为空并且从未设置为 grIDSquares 框架。有什么办法可以解决这个问题。

@H_526_2@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,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
        
    }
    
}

@H_526_2@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;
    }
    
    
    
}

解决方法

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

@H_345_5@minesweeperFrame frame = (minesweeperFramE) SwingUtilities.getWindowAncestor(this);

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

而且你直接把gridsquare加到frame里,这是错误的,必须加到contentPane上,请阅读:

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

大佬总结

以上是大佬教程为你收集整理的如何使用 JLabel 获取 JFrame?尝试时出错全部内容,希望文章能够帮你解决如何使用 JLabel 获取 JFrame?尝试时出错所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。