2013-02-16 3 views
1

첫째, 여기에있는 다른 비슷한 게시물을 모두 살펴 보았지만 아무도 도움을받을 수 없었습니다. 나는 지뢰 찾기 게임을 쓰고 있는데, 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도 가지고 있지 않다. 내가 달릴 때 내 머리 속에.

+0

가의 paintComponent 내에서의 setText를 호출하지 마십시오 자체를 업데이트 할 수있는 이벤트를 발생 때

기본적으로, 그것은 구성 요소와 다른 사람의 무효의 원인이됩니다 요청을 다시 칠하고 또 다시 ... 그리고 당신은 아이디어를 얻는다 – MadProgrammer

+0

그럼 게임으로 업데이트되는 다른 텍스트를 보여줄 수있는 JLabel을 얻으려면 어떻게해야합니까? – art3m1sm00n

+0

답변보기 - 기본적으로, 우리는 관찰자 패턴 – MadProgrammer

답변

3

의 paintComponent 내에서의 setText를 호출하지 마십시오 것은, 다시 다시, 구성 요소 및 다른 다시 그리기 요청의 무효의 원인이되고 ... 당신의 라벨을 업데이트하려고의

대신 아이디어를 얻을 paint 메소드. 광고 레이블을 업데이트하는 데 사용할 수있는 모델의 리스너 인터페이스입니다. 모델 변경, 그것은 당신의 라벨에 반응하고 그것을

+0

나는 그것에 대해 생각하지만, 사용자가 실제로 헤더를 클릭하지 않습니다. 그래서 헤더에 붙어있는 청취자는 결코 방아쇠를 당하지 않을 것입니다. – art3m1sm00n

+1

그것은 듣는 것에 달려 있습니다. MP는 사용자 이벤트를 듣지 않고 모델 이벤트를 수신 대기한다고 말했습니다. 귀하의 모델 (구현했지만)은 게임의 논리를 나타내는 모든 데이터 및 데이터 구조입니다 (UI와 별도로). 어떤 사각형이 지워졌는지, 어떤 것들은 인접한 광산의 수를 나타내는지, 그런 종류의 것을 알고 있습니다. 사용자가 하나의 사각형을 클릭하면 모델에 리스너가 해고되고 다른 사각형의 상태가 바뀌 었는지 파악하고 해당 사각형의 모든 리스너를 시작합니다. – arcy

+0

그랬습니다. 감사! – art3m1sm00n

관련 문제