1

まず、ここにある他の同様の投稿をすべて見ましたが、どれも役に立ちませんでした. 私は掃海艇のゲームを書いており、JFrame の borderLayout の上部に Jlabel を配置しようとしています。フラグを立てるために残っている地雷の数のカウンターを表示させます。グリッド上の他の Jlabels がクリックされるたびに再描画する必要があります。まず、コードをそのまま使用すると、ヘッダー JLabel にテキストが表示されません。テキストを表示させる唯一の方法は、テキストを JLabel コンストラクターに入れることです。これにより、私の paintComponent が呼び出されることはないと思います。また、ゲームの実際のグリッド用に、headerJabel の repaint メソッドへの呼び出しを mouseHandler 内に配置しました。これにより、ユーザーがゲーム内のいずれかのコンポーネントをクリックすると、見出し JLabel が再描画され、ユーザーの動きが反映されます。

基本的に、コンストラクター内に明示的に配置しない限り、JLabel に何も表示されないのはなぜですか?

javax.swing をインポートします。; java.awt をインポートします。;

public class JLabelCounter extends 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);      


}

}

コードをそのまま使用すると、実行時にヘッダーに JLabel さえ含まれていないように見えます。

4

1 に答える 1

3

paintComponent 内から setText を呼び出さないでください。コンポーネントが無効になり、別の再描画リクエストが何度も何度も発生します...

paint メソッドでラベルを更新しようとする代わりに。ラベルの更新に使用できる、ある種のリスナー インターフェイスをモデルに追加します。

基本的に、モデルが変更されると、ラベルが反応して自己更新できるイベントが発生します。

于 2013-02-16T21:29:52.907 に答える