2017-06-21 109 views
0

我想在Java中做一個小小的棋盤遊戲,下面是它的一小段摘錄,只是爲了顯示我的問題是什麼。MouseListener - repaint()不起作用

我有一個JPanel,帶有一個JLabel數組,可視化一塊電路板。每個標籤都有自己的MouseListener。一開始,所有的標籤都是紅色的,如果我點擊其中的任何一個,我都希望所有標籤都變成綠色。

我知道使用setBackground可以很容易地完成每個Label,但是我希望這可以在Panel級別完成,因爲它可能會與簡單的e.x板連接。 chars,整個遊戲將在其上發展,而Labels將只是將其視覺化。

我不知道,我做錯了什麼。我想我沒有想好,但我不知道該怎麼做。任何人都可以幫我嗎?

請不要提示paintComponent重寫,這只是我絕望的結果,當然不起作用。

主類:

import java.awt.EventQueue; 

public class Main { 
    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new 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); 
    } 
} 

面板類:

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類:

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)請提供[可運行示例](http://sscce.org),因此我們也可以重現和調試您的問題。 2)在'paintComponent'方法中將組件添加到面板是一個壞主意。 –

+1

順便說一句 - 而不是'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 modifyFields(Color c) { 
    for(int i=0; i<6; i++) 
     for(int j=0; j<6; j++) { 
      fields[i][j].setBackground(c); 
     } 
} 

和修改Mouse類的mouseReleased方法是這樣的:

public void mouseReleased(MouseEvent arg) { 
    pb.modifyFields(Color.green); 
}