我目前正在编写一个 Connect 4 Applet 游戏,并且我已经实现了所有 AI 逻辑。现在我需要设计一个简单的 gui,这样我就可以玩了。
我有一张我想使用的棋盘图像(透明 png),我希望能够通过单击图像来执行移动(例如,在我想玩的特定列上)。
这样做的最佳方法是什么?我想使用一个扩展 JPanel 的类,我把所有的按钮和东西放在那里……包括画板图像。但是我可以在图像上放一个鼠标监听器吗?
“但是我可以在图像上放一个鼠标监听器吗??”
不,或者至少,不是在你所想的上下文中。
根据您想要实现的目标,您有几个选择。
但是,基本要求是您需要确切知道每个点击点在图像上的位置。这最好通过使用图像编辑程序来绘制“热点”,然后将它们编码到您的程序中来实现
使用 aJLabel
渲染板图像并将 a 附加MouseListener
到它。
我遇到的问题是试图弄清楚如何使用播放器标记更新图像。
使用 aJPanel
并覆盖它paintComponent
来渲染图像和玩家移动/标记。
然后,您将添加一个MouseListener
并从那里监视鼠标点击。
无论您使用哪种方法,我都可能会创建一个代表用户可以点击的热点的List
of s。Rectangle
每次mousePressed
调用时,我都会遍历此列表并使用Rectangle#contains(Point)
,通过鼠标单击点来确定单击了哪个热点。
然后,您将把它与游戏模型进行比较,以确定它是否是有效的移动,并根据需要采取适当的行动。
JToggleButton
在 4x4(?) 中使用 16(?) 个对象GridLayout
。
如在面板中添加复杂图像的答案中所示,从按钮中剔除空间和背景,并在一个自定义用户界面中使用按钮围绕它。
extend
任何组件。我们可以使用布局、按钮和容器的“香草”版本。这有利于组合而不是继承。ActionListener
按钮将响应鼠标焦点/单击或键盘焦点/动作。为什么要将鼠标侦听器添加到图像?如果你的类实现了mouselistener,你可以告诉鼠标点击时要做什么或其他什么。看一看 :
public class Test extends JPanel implements MouseListener {
.
.
.
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}