【问题标题】:How do I make my JButton count and change my display?如何让我的 JButton 计数并更改我的显示?
【发布时间】: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 exampleShort, Self Contained, Correct Example

标签: java swing user-interface graphics jbutton


【解决方案1】:

尝试在moveNum++;moveNum--; 之后添加component.repaint()。 当component 是您要更新的组件时。

另外,删除paintComponent(Graphics g)中的repaint()

【讨论】:

  • 不要在框架上调用重绘。您只需要 repaint() 进行自定义绘画的组件。
  • “组件”是什么意思?
  • 你在某个类中添加了paintComponent,对吧?所以这个类是一个组件。如果你愿意,你可以为 jframe 重新绘制,但效率不高
  • 这两个方法都在我称为 display 的同一个类中。我设置了一个框架,然后将此显示添加到 jframe。那么我的组件是什么?会是显示类吗?
  • 你写new Display()的地方,实例就是组件。如果您不明白,只需重新绘制整个 jframe。 jframe.repaint()
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多