Во-первых, я рассмотрел все другие подобные сообщения здесь, но никто не смог помочь. Я пишу игру с тральщиком, и я пытаюсь поставить Jlabel в верхнюю часть моего пограничного элемента JFrame и показать ему счетчик того, сколько миней осталось помечать. Его нужно перекрасить в любое время, когда щелкнут любой из моих других Jlabels на моей сетке. Во-первых, с моим кодом, поскольку в моем заголовке JLabel никогда не отображается текст. Единственный способ, которым я могу получить текст, чтобы показать, - это поместить его в свой конструктор JLabel. Это заставляет меня думать, что мой paintComponent никогда не называется. Я также поместил вызов моего метода перетаскивания headerJabel внутри mouseHandler для реальной сетки моей игры. Таким образом, если пользователь нажимает на любой из компонентов в игре, заголовок JLabel будет перерисовываться, чтобы отразить движение пользователя.Почему мой JLabel никогда не окрашивается?
В принципе, почему мой JLabel ничего не покажет, если я явно не поставлю его внутри конструктора?
импорт javax.swing. ; импорт java.awt.;
общественного класса 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);
}
}
С кодом, как есть, это выглядит, как если бы я не У меня даже есть JLabe l в моем заголовке, когда я бегу.
Не вызывать SetText внутри paintComponent, это приведет к недействительности компоненты и другому repaint request, снова и снова, и ... Вы получаете идею – MadProgrammer
Затем, как я могу получить JLabel для отображения другого текста, который обновляется в игре? – art3m1sm00n
См. Ответ - в принципе, мы наблюдатель шаблон – MadProgrammer