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