繁体   English   中英

Java repaint()不调用paintComponent

[英]Java repaint() not calling paintComponent

我正在尝试通过使用重画来调用我的paintComponent方法,但从未调用过它。 这是我的第一堂课:

public class start
    {
    public static void main(String[] args){
        Frame f = new Frame();
        f.createFrame();
    }
}  

这是我希望调用paintComponent方法的类,但是发生的只是一个空白框:

import javax.swing.JButton;
import javax.swing.JComponent;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.image.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.Timer;

 public class newFrame implements Runnable,ActionListener
 {
JFrame window = new JFrame("Frame");
int i = 0;
Canvas myCanvas = new Canvas();
public void createFrame(){
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 700, 500);
    window.setFocusable(true);
    window.setFocusTraversalKeysEnabled(false);
    window.setVisible(true);
    Thread t = new Thread(this);
    t.start();
}

public void run(){
    Timer timer = new Timer (17,this);
    timer.start();
}

public void actionPerformed(ActionEvent e){
    myCanvas.updateGame();
    myCanvas.render();
    window.add(myCanvas);
}
}

class Canvas extends JPanel{
int x = 10;
int y = 10;
public void updateGame(){
    x++;
}

public void render(){
    repaint();
    System.out.println("Output1");
}

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g.drawString("hi",x,y);
    System.out.println("Output1");
}
}

输出1被多次打印,但是输出2从不打印。 为什么repaint不调用paintComponent方法?

您只打印 "Ouput1" 在任何地方都没有打印"Output2"

核心问题在您的ActionListener ...

public void actionPerformed(ActionEvent e){
    myCanvas.updateGame();
    myCanvas.render();
    window.add(myCanvas);
}

当您调用window.addJFrame必须首先删除myCanvas ,然后重新添加它,重新验证布局并计划重新绘制,所有这些都需要花费时间,与此同时,您已经跳过了重复此过程,导致框架根本无法跟上您的情况。

而是添加window.add(myCanvas); 给构造函数

public void createFrame() {
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 700, 500);
    window.setFocusable(true);
    window.setFocusTraversalKeysEnabled(false);
    window.setVisible(true);
    window.add(myCanvas);
    Timer timer = new Timer(17, this);
    timer.start();
}

另外,根本不需要使用Thread来启动Timer ,这只是使问题变得混乱。

注意Java已经拥有称为FrameCanvas类,这可能使某些开发人员(尤其是那些无法访问源代码的开发人员)更加困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM