Java 我如何使该方法在计时器中工作?
我创建了draw()方法,在屏幕上绘制变量z的值。计时器应该每次增加z并调用draw(),但draw()只在计时器之外工作。我在控制台中没有错误。有什么想法吗? 这是我的密码:Java 我如何使该方法在计时器中工作?,java,swing,timer,Java,Swing,Timer,我创建了draw()方法,在屏幕上绘制变量z的值。计时器应该每次增加z并调用draw(),但draw()只在计时器之外工作。我在控制台中没有错误。有什么想法吗? 这是我的密码: public class New extends JFrame{ MyComponent komponent; int z=1; Timer timer; class MyComponent extends JComponent{ @Override
public class New extends JFrame{
MyComponent komponent;
int z=1;
Timer timer;
class MyComponent extends JComponent{
@Override
protected void paintComponent(Graphics g2){
Graphics2D g = (Graphics2D)g2;
RenderingHints rh = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHints(rh);
timer=new Timer(50,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw(g); //doesn't work
z++;
}
});
timer.start();
draw(g); //works
}
private void draw(Graphics2D g){
Font myFont = new Font ("Courier New", 1, 30);
g.setFont(myFont);
g.setColor(Color.BLACK);
g.drawString(Integer.toString(z),0,30);
}
}
和整个代码:
问题在于创建计时器并在
paintComponent()内部启动它paintComponent()
是一种被频繁调用的方法。因此,您的计时器将被多次创建
您需要创建计时器并只启动一次
我得到了你的完整代码,并做了一些更改。我想现在它起作用了。在代码中也可以看到我的注释
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class New extends JFrame{
MyComponent komponent;
int z=1;
Timer timer;
class MyComponent extends JComponent{
@Override
protected void paintComponent(Graphics g2){
Graphics2D g = (Graphics2D)g2;
RenderingHints rh = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHints(rh);
//Prasad: Removed the timer from here
draw(g);
}
private void draw(Graphics2D g){
Font myFont = new Font ("Courier New", 1, 30);
g.setFont(myFont);
g.setColor(Color.BLACK);
g.drawString(Integer.toString(z),0,30);
}
}
public New(String string) {
super(string);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension d=kit.getScreenSize();
setBounds(d.width/4, d.height/4, d.width/2, d.height/2);
add(komponent=new MyComponent());
//Prasad: Moved the timer here
timer=new Timer(500,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
komponent.repaint(); //Prasad: Just call repaint()
z++;
}
});
timer.start();
setVisible(true);
}
public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new New("New");
}
});
}
}
如何运行该代码?请提供一个请提供一个调用paintComponent()
的代码简单地说,Swing不是线程安全的,启动一个新线程(计时器就是这样做的)并从中调用draw将不起作用。你们想完成的是什么?我想在画布上画点东西,在下一个计时器勾选中,我想在上一个画布上画点东西,依此类推。类似于photoshop中的图层。这是我以前版本的代码,但这次我需要在以前的画布上绘制一些东西。我在我的问题下的评论中提到了这一点。我只想一直在第一块画布上画画。不过还是要谢谢你。@kapsztat12,如果你想要多层,你必须在框架中添加多个MyComponent
组件。@kapsztat12,我从你在问题中给出的“全部代码”链接中得到了你的代码。如果您的代码现在不一样,请在那里更新。(或至少从问题中删除链接)