Java 为什么我的JLabel从来没有被画过?
首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintComponent从未被调用过。我还为我的游戏的实际网格调用了鼠标手柄内部的headerJabel重绘方法。这样,如果用户单击游戏中的任何组件,标题JLabel将重新绘制自身以反映用户的移动 基本上,为什么我的JLabel不显示任何内容,除非我显式地将其放入构造函数中 导入javax.swing。; 导入java.awt 公共类JLabelCounter扩展了JLabel{Java 为什么我的JLabel从来没有被画过?,java,swing,jlabel,repaint,Java,Swing,Jlabel,Repaint,首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintComponent从未被调用过。我还为我的游戏的实际网格调用了鼠标手柄内部的headerJabel重绘方法。这样,
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);
}
}
}
使用原样的代码,看起来我甚至在运行时头部都没有JLabel 不要在paintComponent中调用setText,它会导致组件失效和另一个重新绘制请求,一次又一次。。。你明白了吗 而不是尝试在绘制方法中更新标签。为您的模型添加某种侦听器接口,您可以使用它来更新标签
基本上,当您的模型发生更改时,它将触发一个事件,您的标签可以对该事件作出反应并自行更新它不要从paintComponent内调用setText,它将导致组件无效,并再次发出重新绘制请求。。。你知道我该如何让JLabel显示随游戏更新的不同文本吗?请参见答案-基本上,我们是一个观察者模式我考虑过,但用户永远不会真正单击标题。因此,附加到标头的侦听器将永远不会被触发,这取决于它所侦听的内容。MP没有说让它监听用户事件,而是监听模型事件。您的模型(无论您如何实现)是所有表示游戏逻辑的数据和数据结构(与UI分离);它知道哪些方块被清除了,哪些方块显示了相邻地雷的数量,诸如此类的事情。当用户点击一个方块时,我希望模型会触发一个监听器,找出其他方块的状态因此发生了什么变化,并为每个方块触发一个监听器。
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);
}