【发布时间】:2015-08-26 10:13:28
【问题描述】:
我正在尝试使用 repaint 来调用我的 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");
}
}
Output1 打印多次,但 Output2 从未打印。为什么重绘没有调用paintComponent方法?
【问题讨论】:
-
看起来你在这两个地方都有
"Output1"... -
不太可能是您的问题,但是启动一个新线程只是为了创建一个摇摆计时器并在其上安排一个工作是非常奇怪的。只需在 createFrame 方法中创建并启动计时器。摆脱 Thread/Runnable 接口。
-
@River 是对的。这是正确的答案。你需要做的就是解决这个问题
-
将 window.add(canvas) 移动到构造函数中,你不需要每秒执行 60 次
-
您可以尝试在
x=100、y=100上绘制您的String。有时左上角是看不见的。
标签: java graphics jframe jpanel repaint