【发布时间】:2017-06-21 13:05:25
【问题描述】:
我正在尝试用Java制作一个小棋盘游戏,以下是它的一小部分摘录,只是为了说明我的问题。
我有一个带有 JLabels 数组的 JPanel 来可视化一个板。每个标签都有自己的 MouseListener。一开始,所有标签都是红色的,如果我点击其中任何一个,我希望它们都变成绿色。
我知道为每个标签使用 setBackground 可以轻松完成,但我希望在 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] );
}
}
}
字段类:
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) 请为您的问题提供runable example,以便我们也可以重现和调试您的问题。 2) 在
paintComponent方法中向面板添加组件是个坏主意 -
顺便说一句 - 而不是
JLabel/MouseListener我建议使用JButton/ActionListener。按钮可以做标签可以做的所有事情,动作监听器将对鼠标和键盘输入做出反应。应该不需要扩展按钮或标签。如果你不打算重写paint方法,也没有必要扩展JPanel。如需更多建议,请按照@SergiyMedvynskyy 的建议发布 MCVE。 -
同时避免扩展
JFrame,也尽量不要使用Window作为你的班级名称,它可能会与java.awt.Window混淆 -
感谢您的所有建议,我对编程和 stackoverfow 还很陌生,所以非常感谢。我把上面的代码缩短了一点,所以我希望现在更容易阅读。反正还是不知道为什么 MouseListener 中的 repaint() 方法不起作用……
-
addFields从不从 PanelBoard 中删除 old 字段。
标签: java swing repaint mouselistener