2017-01-27 52 views
-3

Animate和Anim1有兩個java文件。Anim1文件有JFrame,我想附加Animate文件,它具有文本在屏幕上滾動的邏輯(應該是JFrame屏幕)。但我無法找到一種方法。此外,代碼拋出以下編譯時錯誤 - 線程「線程-0」中的異常java.lang.Error:未解決的編譯問題: 方法repaint()未定義該類型動畫編寫一個程序使用java swing來滾動文本

import java.awt.Graphics; 

public class Animation implements Runnable { 
    int x=500; 
    String s="hello world"; 
    public void run(){ 
     while(true){ 
      repaint(); 
      try{ 
       Thread.sleep(50); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
       } 

     } 

    } 
    public void paint(Graphics g){ 
     g.drawString("hello world", x,-10); 
     x--; 
     if(x< -100){ 
      x=500; 
     } 
    } 

} 

import java.awt.Component; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Anim1 { 
    public static void main(String[] args){ 
     Animation a= new Animation(); 
     Thread t= new Thread(a); 
     t.start(); 

     JFrame frame= new JFrame("animate"); 
     frame.setVisible(true); 
     frame.setSize(400,400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    } 
} 
+1

''方法repaint()對於類型Animation「'是未定義的 - 好的,你調用了一個名爲'repaint()'的方法,你在哪裏定義該方法? – David

+0

你想在JFrame上調用'repaint()'。 – nbokmans

+0

no..isnt repaint()方法調用paint(graphics g)方法....不是自動的 –

回答

0

也許.repaint()需要傳遞一些東西來工作。通常動畫會在畫布上發生,然後您會更新。更新方法必須與所有你想要更新的東西分開。

canvas.update() 
public void update(){ 
what it is you wish to update 
canvas.draw() 
} 

我希望這有助於。編輯所以你的畫布是你的JFrame

+0

但如何將動畫文件添加到Jframe或甚至畫布 –

+0

說「不是我的問題清楚」(轉述語法)不會幫助。如果這不是你要求的,請重新翻譯。至於你的第一條評論,你可以用你自己的方法來覆蓋動畫類,這是很多人做的。 – Finn

+0

你能否給我提供任何外部鏈接以正確理解這件事... –

5

在Swing組件中找到重繪方法 - 對paint和paintComponent也是一樣。在沒有擴展Swing comopnent的類中調用它是沒有意義的,除非您對另一個作爲組件的對象進行重新調用。同樣給一個非組件類的繪畫方法是沒有意義的,因爲你不覆蓋任何繪畫方法。

可能你的動畫類應該擴展JPanel,以便它可以重寫paintComponent(漆),並且使得repaint()電話是有道理的。 總是@Override註釋預先繪製您的繪畫方法(或任何其他方法,您認爲覆蓋父方法)。這樣編譯器會在你沒有正確覆蓋該方法(或根本)時向你抱怨。你也想在你的覆蓋中調用super的繪畫方法。

最重要的是:閱讀Swing繪畫教程,因爲它的所有解釋。退房:Performing custom painting

你的畫法會看起來像這樣:

@Override 
protected void paintComponent(Graphics g) { 
    // always call the super's method to clean "dirty" pixels 
    super.paintComponent(g); 

    // then draw the String. Make y a field too, so it can be controlled 
    // more easily 
    g.drawString(s, x, y); 
} 

請注意,我不改變的x值或撥打我的畫法中的任何狀態改變的代碼,這是由設計。 paintComponent方法僅用於繪製。您無法完全控制是否或即將被調用,因此可以稱爲多個次。

取而代之,x值應在「遊戲循環」內更改,這裏是您的Runnable的run()方法。另外,根據我的意見,雖然可以使用Thread/Runnable創建此代碼,但它更安全,而不是使用Swing Timer來驅動動畫,因爲這樣可以避免您不必擔心Swing線程問題。

+0

我使用了import.javax.swing *語句,並且repaint()的編譯錯誤消失了。 ...但我沒有得到你所說的關於擴展JPanel和paintComponent()的東西......並且最後沒有編譯錯誤,但是文本沒有在框架上滾動 –

+0

thnx man,爲了給出正確的輸入... –

+0

@ gramsci_11:關於你的第一個評論 - 你有任何代碼**添加**你的組件到JFrame嗎? –

相關問題