첫째, 여기에있는 다른 비슷한 게시물을 모두 살펴 보았지만 아무도 도움을받을 수 없었습니다. 나는 지뢰 찾기 게임을 쓰고 있는데, Jlabel을 내 JFrame의 경계선의 꼭대기에 배치하려고합니다 .Layout, 얼마나 많은 광산이 남았는지에 대한 카운터를 보여 주도록하십시오. 내 눈금에있는 다른 Jlabel 중 하나를 클릭 할 때마다 다시 칠해야합니다. 첫째, 내 코드 JLabel에 아무 텍스트도 표시되지 않습니다. 텍스트를 표시 할 수있는 유일한 방법은 내 JLabel 생성자에 넣는 것입니다. 그게 내 paintComponent가 절대 호출되지 않는다고 생각하게합니다. 나는 또한 내 게임의 실제 그리드에 대한 mouseHandler 내 headerJabel의 repaint 메소드에 대한 호출을 배치했습니다. 그렇게하면 사용자가 게임의 구성 요소 중 하나를 클릭하면 표제 JLabel이 사용자의 이동을 반영하여 다시 그립니다.왜 내 JLabel은 페인트되지 않습니다?
기본적으로 내 JLabel은 명시 적으로 생성자 안에 넣지 않으면 아무 것도 표시하지 않습니다.
import 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도 가지고 있지 않다. 내가 달릴 때 내 머리 속에.
가의 paintComponent 내에서의 setText를 호출하지 마십시오 자체를 업데이트 할 수있는 이벤트를 발생 때
기본적으로, 그것은 구성 요소와 다른 사람의 무효의 원인이됩니다 요청을 다시 칠하고 또 다시 ... 그리고 당신은 아이디어를 얻는다 – MadProgrammer
그럼 게임으로 업데이트되는 다른 텍스트를 보여줄 수있는 JLabel을 얻으려면 어떻게해야합니까? – art3m1sm00n
답변보기 - 기본적으로, 우리는 관찰자 패턴 – MadProgrammer