[英]How i can make method works in Timer?
我創建了 draw() 方法,該方法在屏幕上繪制變量 z 的值。 定時器應該增加 z 並每次調用 draw() 但 draw() 只能在定時器之外工作。 我在控制台中有零錯誤。 有任何想法嗎? 這是我的代碼:
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);
}
}
和整個代碼: https : //pastebin.com/mH2u9YVr
創建計時器並在paintComponent()
啟動它是問題所在。 paintComponent()
是一種經常被調用的方法。 因此,您的timer
一次又一次地被創建。
您需要創建計時器並僅啟動一次。
我得到了你的完整代碼並做了一些改動。 我認為現在它有效。 也請參閱我在代碼中的注釋。
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");
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.