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) {}
}
1)请提供[可运行示例](http://sscce.org),因此我们也可以重现和调试您的问题。 2)在'paintComponent'方法中将组件添加到面板是一个坏主意。 –
顺便说一句 - 而不是'JLabel' /'MouseListener'我推荐使用'JButton' /'ActionListener'。一个按钮可以完成一个标签可以做的所有事情,一个动作侦听器将对鼠标和键盘输入做出反应。应该不需要扩展按钮或标签。如果你不打算重写paint方法,也不需要扩展'JPanel'。有关进一步的建议,请按照@SergiyMedvynskyy的建议发布MCVE。 –
并且避免扩展'JFrame',并且尽量不要使用'Window'作为你的类的名字,它可能与['java.awt.Window'](https://docs.oracle.com/javase/)混淆7/docs/api/java/awt/Window.html) – Frakcool