Java JFrame extended不更新,除非重新调整大小

Java JFrame extended不更新,除非重新调整大小,java,swing,jframe,Java,Swing,Jframe,我有一个类,Game,它扩展了JFrame,我使用它的paint方法来绘制所有的图形。每当我添加要绘制的新内容(工件)时,都需要调整窗口的大小才能获得要渲染的添加内容。为什么呢?我试着在画图后调用setVisisble(true),但没有解决问题 其次,当我使用drawBottomText(g)绘制字符串时,它显示得非常好,但是如果我更改正在绘制的字符串,则仍然会显示旧字符串。调整窗口大小,使其覆盖“旧”字符串会将其删除 我希望paint()像绘制循环一样工作,从最后一帧中删除旧图像,只有在这个

我有一个类,Game,它扩展了JFrame,我使用它的paint方法来绘制所有的图形。每当我添加要绘制的新内容(工件)时,都需要调整窗口的大小才能获得要渲染的添加内容。为什么呢?我试着在画图后调用setVisisble(true),但没有解决问题

其次,当我使用drawBottomText(g)绘制字符串时,它显示得非常好,但是如果我更改正在绘制的字符串,则仍然会显示旧字符串。调整窗口大小,使其覆盖“旧”字符串会将其删除

我希望paint()像绘制循环一样工作,从最后一帧中删除旧图像,只有在这个迭代中绘制的才会显示出来。显然,这种心态并不准确

public class Game extends JFrame implements  MouseListener 
{
...
   public void paint (Graphics g){
       drawBottomText(g);

       board.drawBoard(g);

    }

    private void drawBottomText(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        Font font = new Font("Serif", Font.PLAIN, 20);
        g2.setFont(font);

        g2.drawString(bottomString, 40, FRAME_HEIGHT - 20); 
    }
 ...
}

     public void paintComponent(Graphics g)
   {  
      Graphics2D g2 = (Graphics2D) g;
      BasicStroke stroke = new BasicStroke(10);
      g2.setStroke(stroke);

      if (isAnX){
          drawX(g2);
      }
      else {
          drawO(g2);
      }
   }
这是由board调用的draw代码。drawBoard(g)


使用这种绘图方法(扩展JFrame并使用paint()),为什么需要调整窗口的大小才能渲染新的绘图,为什么旧的字符串会粘在一起?

正如@Andrew Thompson和@MadProgrammer在评论中所说,最好在JPanel上进行自定义绘图,然后将JPanel添加到JFrame中。在paintComponent()方法中进行绘图,并在更改绘图内容时在JPanel类中调用repaint()。遵循这种定制绘画方法可以解决问题中所述的问题

嗯,
JFrame
没有
paintComponent
,因此有一些有趣的东西,您应该在执行任何自定义绘制之前调用
super.paintComponent
。如果您想更新组件,应该调用
repaint
@MadProgrammer“嗯,
JFrame
没有
paintComponent
,…”这就是为什么我总是试图记住使用
@Override
表示法。当然,我们可以发现一个方法不是使用调试器调用的,但我更喜欢这种表示法,因为a)文档,b)在编译时被警告。为了更快地获得更好的帮助,请发布a或@mad程序员您的意思是,调用super.paintComponent?super.paintComponent()?尝试此操作时会出现编译错误。在进行自定义绘制时不应使用组件,对吗?你能解释一下我为什么要打电话给repaint吗?那你就有问题了。正如我在第一条评论中所说,
JFrame
没有
paintComponent
,因此没有任何东西会调用它。我不确定这是因为你把代码切分了,还是因为你实际上是如何实现的。必须对需要绘制的组件调用
repaint
,因为Swing使用被动渲染引擎,只绘制它认为需要绘制的组件。
public class Piece extends JComponent{
...
   private void drawO(Graphics2D g2){
       g2.setColor(Color.blue);
       Ellipse2D.Double ellipse = new Ellipse2D.Double(xPos  - IMG_WIDTH/2 * shrinkBy, yPos - IMG_HEIGHT/2 * shrinkBy, IMG_WIDTH * shrinkBy, IMG_HEIGHT * shrinkBy);
       g2.draw(ellipse);
   }

   private void drawX(Graphics2D g2){
       g2.setColor(Color.red);
       Point2D.Double topRight = new Point2D.Double(xPos + IMG_WIDTH/2 * shrinkBy, yPos - IMG_HEIGHT/2 * shrinkBy);
       Point2D.Double bottomLeft = new Point2D.Double(xPos - IMG_WIDTH/2 * shrinkBy, yPos + IMG_HEIGHT/2 * shrinkBy);
       Point2D.Double bottomRight = new Point2D.Double(xPos + IMG_WIDTH/2 * shrinkBy, yPos + IMG_HEIGHT/2 * shrinkBy);
       Point2D.Double topLeft = new Point2D.Double(xPos - IMG_WIDTH/2 * shrinkBy, yPos - IMG_HEIGHT/2 * shrinkBy);

       Line2D.Double botRightToTopLeft = new Line2D.Double(topRight, bottomLeft);
       Line2D.Double botLeftToTopRight = new Line2D.Double(topLeft, bottomRight);
       g2.draw(botRightToTopLeft);
       g2.draw(botLeftToTopRight);

   }
...
}