gpt4 book ai didi

java - 为什么我的 JLabel 从未被绘制?

转载 作者:行者123 更新时间:2023-11-29 05:48:28 25 4
gpt4 key购买 nike

首先,我查看了此处所有其他类似的帖子,但没有一个能提供帮助。我正在写一个扫雷游戏,我试图在我的 JFrame 的 borderLayout 的顶部放置一个 Jlabel,并让它显示有多少地雷需要标记的计数器。只要单击我网格上的任何其他 Jlabel,它就需要重新绘制。首先,使用我的代码时,标题 JLabel 上从未显示任何文本。显示文本的唯一方法是将其放入我的 JLabel 构造函数中。这让我认为我的 paintComponent 永远不会被调用。我还在 mouseHandler 中调用了我的 headerJabel 的重绘方法,用于我游戏的实际网格。这样,如果用户单击游戏中的任何组件,标题 JLabel 将重新绘制自身以反射(reflect)用户的移动。

基本上,为什么我的 JLabel 不显示任何内容,除非我明确地将它放入构造函数中?

导入 javax.swing.;导入 java.awt.;

公共(public)类 JLabelCounter 扩展 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。

最佳答案

不要从 paintComponent 中调用 setText,它会导致组件失效和另一个重绘请求,一次又一次......你明白了

而不是尝试在 paint 方法中更新标签。为您的模型添加某种类型的监听器界面,您可以使用它来更新标签。

基本上,当您的模型发生变化时,它会触发一个事件,您的标签可以对此使用react并自行更新

关于java - 为什么我的 JLabel 从未被绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com