2017-06-21 92 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); 
}