【发布时间】:2021-09-26 04:53:09
【问题描述】:
所以我正在创作一幅有点互动的国际象棋游戏画作。基本上,目前只有 2 个按钮:下一步和上一步。下一个移动按钮将 int 变量 moveNum 加 1,上一个移动按钮将 int 变量 moveNum 减 1。基本上是这样的:
int moveNum = 0;
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("Next Move"))
{
moveNum++;
Display.instance.repaint();
}
else if(e.getActionCommand().equals("Previous Move"))
{
moveNum--;
Display.instance.repaint();
}
}
然后我只有大量的图形,每个 moveNum 值一个。它看起来有点像这样:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.BLACK);
if (moveNum == 0)
{
g2d.fill(new Rectangle2D.Double(0, 0, 10, 10));//just for simplicity
}
else if (moveNum == 1)
{
g2d.fill(new Rectangle2D.Double(0, 0, 10, 10));
g2d.fill(new Rectangle2D.Double(0, 0, 20, 10)); //again for simplicity
}
else if (moveNum ==2)
{
g2d.fill(new Rectangle2D.Double(0, 0, 10, 10));
g2d.fill(new Rectangle2D.Double(0, 0, 20, 10));
g2d.fill(new Rectangle2D.Double(0, 0, 30, 10)); //simplicity
}
...
}
但是当我按下按钮时,图形并没有改变。我可能会错过什么?
更新:我尝试在 moveNum 之后调用 Display.instance.repaint(),但现在我根本没有得到任何图形。可能是什么问题?
更新 #2:paint 组件正在执行,因为当我输入 System.out.println("Test");到方法,它正在被打印。我现在也看到了无限递归问题(不知道我以前怎么没看到过)。但即使在修复它之后,我仍然没有得到我想要的图形。我意识到由于某种原因,当我全屏显示时,我可以获得一些图形。但是按钮仍然不会改变图形。使用 System.out.println("Test");方法,我发现在我运行程序时打印了一次“测试”,当我全屏并获取图形时打印了两次,当我按下下一步按钮时又打印了 12 次。我不确定那里发生了什么,我的按钮设置不正确吗?
最终更新:我没有 MRE/SSCE,但我发现了我的问题。我意识到我是宇宙中最大的白痴之一,我的问题是大写。我的按钮不起作用,因为我在 e.getActionCommand().equals("Next Move")) 段中将它们中的两个都大写了错误的东西。无论如何,非常感谢您的帮助。我不认为我会发现无限递归问题,因此特别感谢您的帮助。
【问题讨论】:
-
1) 永远不要在 paintComponent() 方法中调用 repaint()。 2) 在您的 ActionListener 中,您在要重绘的组件上调用 repaint()。
-
为什么我不应该在 paintComponent() 方法中使用 repaint()?我想我被专门教导要这样做......
-
在
paintComponent方法中删除所有repaint();代码。在actionPerformed事件代码块中:if(e.getActionCommand().equals("Next Move")) { moveNum++; jPanel1.repaint(); } else if(e.getActionCommand().equals("Previous move")) { moveNum--; jPanel1.repaint(); }。此代码假定您的图形位于 JPanel 上。如果是其他组件,请相应地更正它。 -
谢谢,我已经这样做了。在更新中提到它;刚刚忘记更新代码了。
-
试图帮助的人提出了一些可以在 MRE / SSCCE 中回答的问题。为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。
标签: java swing user-interface graphics jbutton