2013-02-16 4 views
1

Во-первых, я рассмотрел все другие подобные сообщения здесь, но никто не смог помочь. Я пишу игру с тральщиком, и я пытаюсь поставить 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 в моем заголовке, когда я бегу.

+0

Не вызывать SetText внутри paintComponent, это приведет к недействительности компоненты и другому repaint request, снова и снова, и ... Вы получаете идею – MadProgrammer

+0

Затем, как я могу получить JLabel для отображения другого текста, который обновляется в игре? – art3m1sm00n

+0

См. Ответ - в принципе, мы наблюдатель шаблон – MadProgrammer

ответ

3

Не называйте SetText внутри paintComponent, это приведет к недействительности компонента и другого запроса перекрашивать, снова и снова ... Вы получаете идею

Вместо того, чтобы обновить метку в метод окраски. Представьте себе какой-то интерфейс слушателя, который вы можете использовать для обновления метки.

В основном, когда ваши изменения модели, будут срабатывать событие, которое ваша метка может реагировать и обновлять себя

+0

Я думал об этом, но пользователь никогда не будет на самом деле нажать на заголовок. SO слушатель, прикрепленный к заголовку, никогда не будет вызван – art3m1sm00n

+1

Это зависит от того, что он слушает. MP не сказал, что он прослушивает пользовательское событие, но для прослушивания модельного события. Ваша модель (как бы вы ее не реализовали) - это все данные и структура данных, которые представляют собой логику игры (отдельно от пользовательского интерфейса); он знает, какие квадраты были очищены, какие из них показывают количество соседних мин, что-то вроде этого. Когда пользователь нажимает на один квадрат, я ожидаю, что у модели будет возбужден слушатель, выясните, что изменили состояния других квадратов, и запустили слушателя для каждого из этих квадратов. – arcy

+0

это сделал. благодаря! – art3m1sm00n

Смежные вопросы