当前位置: 首页 > 知识库问答 >
问题:

为什么我的JLabel从来没有被画过?

凌声
2023-03-14

首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的html" target="_blank">代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintComponent从未被调用过。我还为我的游戏的实际网格调用了鼠标手柄内部的headerJabel重绘方法。这样,如果用户单击游戏中的任何组件,标题JLabel将重新绘制自身以反映用户的移动。

导入javax。摆动导入java。awt。;

公共类JLabel计数器扩展JLabel{

private MinesweeperModel model;
public JLabelCounter(MinesweeperModel myModel)
{
   model = myModel;    

}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    int minesRemaining = model.numberOfMinesRemaining();
    setText("Mines remaining" + minesRemaining);

}

}

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

public class MinesweeperPanel extends JPanel {

 private MinesweeperModel model;
 private JLabelCounter labelCounter;

public MinesweeperPanel(MinesweeperModel myModel, JLabelCounter counter)
{
    model = myModel;
    labelCounter = counter;
    setLayout(new GridLayout(10,10));
    //addMouseListener(new MouseHandler());

     for(int i = 0; i <10; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            MinesweeperJLabel myJLabel = new MinesweeperJLabel(i,j,myModel);
            myJLabel.addMouseListener(new MouseHandler());
            add(myJLabel);
        }

    }

}

private class MouseHandler extends MouseAdapter
{
    public void mouseClicked(MouseEvent e)
    {

        MinesweeperJLabel labelClicked = (MinesweeperJLabel)e.getSource();
        int x = labelClicked.getXCoordinate();
        int y = labelClicked.getYCoordinate();
        int buttonClicked = e.getButton();

        if (buttonClicked == 1)
        {
            model.stepOnMine(x,y);
        }
        else if(buttonClicked == 3)
        {
            model.flagMine(x, y);
        }
      repaint(); 
      labelCounter.repaint();


    }
}

}

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class MinesweeperFrame  extends JFrame{

public MinesweeperFrame()
{
    MinesweeperModel myModel = new MinesweeperModel();
    setTitle("My Super Awesome Minesweeper Game!");
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    setSize(screenSize.width/2,screenSize.height/2);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JLabelCounter counter = new JLabelCounter(myModel);
    Container contentPane = getContentPane();
    MinesweeperPanel panel = new MinesweeperPanel(myModel,counter);
    contentPane.add(counter,BorderLayout.PAGE_START);
    contentPane.add(panel);

    setVisible(true);      


}

}

使用原样的代码,看起来我甚至在运行时头部都没有JLabel。

共有1个答案

和斌
2023-03-14

不要调用setText从内的画组件,它会导致一个无效的组件和另一个重新绘制请求,一次又一次和...你明白我的意思

而不是尝试在绘制方法中更新标签。为您的模型添加某种侦听器接口,您可以使用它来更新标签。

基本上,当你的模型改变时,它会触发一个事件,你的标签可以对它做出反应并自我更新

 类似资料:
  • 问题内容: 我的servlet中有以下代码 这段代码只是返回图像的第一帧。 如何获得完整的GIF图片? 问题答案: 您的GIF无法动画,因为您只向客户端发送第一帧。:-) 实际上,您是这样,因为仅读取第一帧(并且a 只能包含单个帧/图像)。然后,您将该单个帧写入servlet输出流,并且结果将不进行动画处理(应该可以使用来创建动画GIF ,但是这样做的代码将非常冗长,请参阅如何在Java中对动画G

  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: →有关使用不同示例的异步行为的更一般说明,请参见 在函数内部修改变量后 , 为什么变量未更改?-异步

  • 我启动了一个国际象棋项目,使用一些旧代码绘制地图,基本上所有内容都是复制粘贴的。问题是方块没有出现?我试着修了一会儿,但没有找到解决办法。下面可能是三种最重要的方法,并简要介绍了整个项目。有些是德语的。 https://drive.google.com/file/d/1nnZHLB0Ycy04eMyYbEmduMwbGhVLZ2VB/view?usp=sharing

  • 我有一个C++实验室,问题是:用户应该为X输入一个值(X是所持有的测试数)。如果x<15,程序不计算任何东西。如果X在16和30之间,程序应计算C=1.0/10.0*(24a);如果X>30,程序应计算C=0.15(24*a)。我的multiple if代码可以工作,但是当我输入X的值时,方程没有解出。有人知道吗??

  • 因此,我的问题是:为什么还没有被否决?如果核心Java团队已经决定它是坏的,那么他们一定也考虑过弃用。他们反对这样做的理由是什么(在Java8中,它仍然没有被反对)?

  • 今天我开始玩分支,检查两个布尔值。我很确定,在某些优化级别上,它们将简单地添加并检查,但gcc和CLANG不是这样。为什么gcc不优化两个bool检查,用addition和一个check替换它们?让我给你看一个例子: 两个分支(test+je)不应该比加法和分支(add+jne)慢吗? 编辑:我真正的意思是乘法,因为在true和false的情况下(1+0),加法给出true(1),但乘法给出正确的