[英]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.add
, JFrame
必须首先删除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已经拥有称为Frame
和Canvas
类,这可能使某些开发人员(尤其是那些无法访问源代码的开发人员)更加困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.