2017-06-21 12 views
0

私はJavaでボードゲームを作ろうとしていますが、以下は少し問題です。MouseListener - repaint()が機能しません

ボードを視覚化するためにJLabelの配列を持つJPanelがあります。すべてのラベルには独自のMouseListenerがあります。最初はすべてのラベルが赤ですが、いずれかをクリックするとすべてのラベルが緑色に変わります。

ラベルごとにsetBackgroundを使って簡単に行うことができますが、Panelのレベルでこれを行うことをお勧めします.e.xのシンプルなボードに接続されている可能性があります。キャラクターはゲーム全体が発展し、ラベルはそれを視覚化するだけです。

私は何が間違っているのか分かりません。私はそれをよく考えていないと思うが、私はそれをどうやって行うのか分からない。誰でも私を助けてくれますか?

paintComponentをオーバーライドしないようにしてください。それは私の絶望の影響であり、もちろん動作しません。

メインクラス:

import java.awt.EventQueue; 

public class Main { 
    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Window(); 

      } 
     }); 
    } 
} 

Windowクラス:

import java.awt.FlowLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 

public class Window extends JFrame { 

    public Window() { 
     setMinimumSize(new Dimension(500, 600)); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 

     PanelBoard b = new PanelBoard(); 
     add(b); 
     setVisible(true); 
    } 
} 

Panelクラス:

import javax.swing.JPanel; 
import java.awt.FlowLayout; 
import java.awt.Dimension; 
import java.awt.Color; 

public class PanelBoard extends JPanel { 

    private Field fields[][] = new Field[6][6]; 

    public PanelBoard() { 
     setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     setPreferredSize(new Dimension(60*6, 60*6)); 

     addFields(Color.red); 

    } 

    public void addFields(Color c) { 
     for(int i=0; i<6; i++) 
      for(int j=0; j<6; j++) { 
       fields[i][j] = new Field(this, c); 
       add(fields[i][j]); 
      } 
    } 
} 

Fieldクラス:

import javax.swing.BorderFactory; 
import javax.swing.JLabel; 
import java.awt.Color; 
import java.awt.Dimension; 

public class Field extends JLabel { 

    public Field(PanelBoard pb, Color c) { 
     setBackground(c); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     setOpaque(true); 
     setPreferredSize(new Dimension(60, 60)); 

     addMouseListener(new Mouse(pb, this)); 
    } 
} 

のMouseListenerクラス:

public void modifyFields(Color c) { 
    for(int i=0; i<6; i++) 
     for(int j=0; j<6; j++) { 
      fields[i][j].setBackground(c); 
     } 
} 

をして、このようなクラスMousemouseReleased方法を変更します:

import java.awt.Color; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.BorderFactory; 

public class Mouse implements MouseListener { 

    PanelBoard pb; 
    Field f; 

    public Mouse(PanelBoard pb, Field f) { 
     this.pb = pb; 
     this.f = f; 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg) { 
     pb.addFields(Color.green); 
     pb.revalidate(); 
     pb.repaint(); 

    } 

    @Override 
    public void mouseClicked(MouseEvent arg) {} 
    @Override 
    public void mousePressed(MouseEvent arg) {} 
    @Override 
    public void mouseExited(MouseEvent arg) {} 
    @Override 
    public void mouseEntered(MouseEvent arg) {} 
} 
+2

1)[runable例を提供してください。 ](http://sscce.org)で問題を再現し、問題をデバッグすることもできます。 2) 'paintComponent'メソッド –

+1

BTWのパネルにコンポーネントを追加するのは悪い考えです。' JLabel'/'MouseListener'ではなく、' JButton'/'ActionListener'を使うことをお勧めします。ボタンはラベルが持つことができるすべてのことを行うことができ、アクションリスナーはマウスとキーボード入力の両方に反応します。ボタンやラベルを拡張する必要はありません。 paintメソッドをオーバーライドしたくない場合は、 'JPanel'を拡張する必要はありません。さらなる助言が必要な場合は、@ SergiyMedvynskyyの示唆に基づいてMCVEを投稿してください。 –

+1

また、 'JFrame'を拡張することも避けてください。また、クラス名として' Window'を使用しないと、['java.awt.Window']と混同される可能性があります(https://docs.oracle.com/javase/ 7/docs/api/java/awt/Window.html) – Frakcool

答えて

0

だけPanelBoardに、このメソッドを追加

public void mouseReleased(MouseEvent arg) { 
    pb.modifyFields(Color.green); 
} 
関連する問題