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