Java Jpanel中的JLabel数组未显示

Java Jpanel中的JLabel数组未显示,java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,因此,我对此非常恼火,我似乎无法理解为什么这些jLabel没有被吸引到窗口。我一直在看我过去做过的另一个项目,它在JPanel中也使用了JLabels,看起来一切都很好。有人看到我把事情搞砸了吗 package lab19_20; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class Lab19_20 extends JFrame impl

因此,我对此非常恼火,我似乎无法理解为什么这些jLabel没有被吸引到窗口。我一直在看我过去做过的另一个项目,它在JPanel中也使用了JLabels,看起来一切都很好。有人看到我把事情搞砸了吗

package lab19_20;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class Lab19_20 extends JFrame implements ActionListener, MouseListener
{


    JLabel[] lblBoard = new JLabel[16];
    int[] nums = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8};
    int firstChoice = -1;
    int tries = 0;
    JLabel lblFirst;
    JButton btnGame = new JButton("New Game");
    JLabel lblTries = new JLabel("0");
    JPanel pnlControls = new JPanel();
    JPanel pnlBoard = new JPanel();
    Font lblBoardFont = new Font("Helvetica", Font.BOLD, 30);
    Container content = this.getContentPane();

    public Lab19_20()
    {
        setTitle("The Concentration Game");
        setVisible(true);
        setSize(500, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        createLabels();
        content.add(pnlBoard, BorderLayout.NORTH);        
        pnlControls.add(btnGame);
        pnlControls.add(lblTries);
        content.add(pnlControls, BorderLayout.SOUTH);

        btnGame.addActionListener(this);
    }

    void createLabels()
    {
        pnlBoard.setLayout(new GridLayout(4, 4, 5, 5));
        for(int i = 0; i < lblBoard.length; i++)
        {
            lblBoard[i] = new JLabel("", JLabel.CENTER);
            lblBoard[i].setVisible(true);
            lblBoard[i].setOpaque(true);
            lblBoard[i].setBackground(Color.BLUE);
            lblBoard[i].setForeground(Color.BLACK);
            lblBoard[i].setFont(lblBoardFont);
            lblBoard[i].addMouseListener(this);
            lblBoard[i].setName("" + i);
            pnlBoard.add(lblBoard[i]); 
        }
    }

    void shuffle()
    {
        int num1, num2, tmp = 0;
        Random r = new Random();
        for (int i = 0; i < 500; i++)
        {
            num1 = r.nextInt(nums.length);
            num2 = r.nextInt(nums.length);
            tmp = nums[num1];
            nums[num1] = nums[num2];
            nums[num2] = tmp;
        }
    }

    @Override
    public void actionPerformed(ActionEvent ae) 
    {
        shuffle();
        firstChoice = -1;
        for (int i = 0; i < lblBoard.length; i++)
            lblBoard[i].setText("");
        tries = 0;
        lblTries.setText("" + tries);

    }

    @Override
    public void mouseClicked(MouseEvent me) 
    {
        JLabel l = (JLabel) me.getSource();
        int theNumber = Integer.parseInt(l.getName());
        if (firstChoice == -1)
        {
            l.setText("" + nums[theNumber]);
            lblFirst = l;
            firstChoice = theNumber;  
        }
        else if (nums[theNumber] != nums[firstChoice])
        {
            l.setText("" + nums[theNumber]);
            pnlBoard.paintImmediately(0,0, pnlBoard.getWidth(), pnlBoard.getHeight());

            try
            {
                Thread.sleep(250);
            }
            catch(InterruptedException blah){}

            lblFirst.setText("");
            l.setText("");
            lblFirst = null;
            firstChoice = -1;
            tries++;
        }
        else
        {
            l.setText("" + nums[theNumber]);
            firstChoice = -1;
            tries++;
        }

        lblTries.setText("" + tries);

    }  

    public static void main(String[] args) 
    {
        Lab19_20 console = new Lab19_20();
    }

    @Override public void mousePressed(MouseEvent me) {}
    @Override public void mouseReleased(MouseEvent me) {}   
    @Override public void mouseEntered(MouseEvent me) {}   
    @Override public void mouseExited(MouseEvent me) {} 

}
包装lab19_20;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.util.Random;
公共类Lab19_20扩展JFrame实现ActionListener、MouseStener
{
JLabel[]lblBoard=新的JLabel[16];
int[]nums={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8};
int firstChoice=-1;
int=0;
JLabel-lblFirst;
JButton btnGame=新JButton(“新游戏”);
JLabel lblTries=新JLabel(“0”);
JPanel pnlControls=新的JPanel();
JPanel pnlBoard=新的JPanel();
Font lblBoardFont=新字体(“Helvetica”,Font.BOLD,30);
容器内容=this.getContentPane();
公共实验室19_20()
{
setTitle(“专注游戏”);
setVisible(真);
设置大小(500400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
createLabels();
内容。添加(pnlBoard,BorderLayout.NORTH);
pnlControls.add(btnGame);
pnlControls.add(lblTries);
添加(pnlControls,BorderLayout.SOUTH);
btnGame.addActionListener(此);
}
void createLabels()
{
pnlBoard.setLayout(新网格布局(4,4,5,5));
对于(int i=0;i
两件简单的事情

  • 调用
    setVisible(true)最后,在您建立基本UI之后
  • 使用
    lblBoard[i].setText(“+i”)代替(或同时)
    lblBoard[i].setName(“+i”)

  • 首先调用
    setVisible(true)
    last就是这样,只要我在setName之后添加了setText,它就解决了这个问题。想解释一下为什么它会这样对我吗?setVisible也在原来的位置工作(我总是在顶部执行setVisible,因为这是我老师教我的方式,最后设置它有多大不同?)1-它工作了,因为
    setText
    改变了显示的内容
    setName
    用作内部标记,主要用于GUI表单编辑器,但有时也用于其他用途(一些布局管理器使用它)。2-在构建UI之前调用
    setVisible
    可能会使UI显示为“空”或在某些系统上仅部分更新,我们还建议最后调用它以避免这些问题…啊,感谢有关setVisible的信息。结果表明,它出错的原因不是我没有使用setName,而是因为我使用“”来清空setText。结果显示“”将导致标签不显示,而“”将显示。我猜“”不是有效字符串?我的教授告诉我们使用“”,我假设“”表示空文本。某种程度上,
    与使用
    null
    (或多或少)是一样的,因为它会导致一个大小计算等于
    0x0
    ,使它看起来好像标签没有显示出来……啊,那么,这是否意味着我将使标签不显示的文本/名称置零?