2013-12-22 67 views
0

我試圖讓代碼移動畫布上繪製的東西。但是,我不知道該怎麼辦。截至目前,每當我按下應該使對象向右或向左移動的按鍵時,繪製的對象就會消失。但是,其他不應該移動的物體會停留在屏幕上。該代碼不會重新正確

更多信息:運行時,代碼只會顯示繪製的圓。但是,我認爲隨着繪圖一直閃爍閃爍,它將永久重新繪製。當我嘗試按下與按鍵監聽器相關聯的按鈕時,沒有任何反應。

按下按鈕幾秒鐘後,圓圈完全消失。

這裏是質量低劣的代碼和混亂:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import javax.imageio.*; 
import java.io.*; 
public class FaceFrame extends JFrame { 
    private FaceCanvas face; 
    public FaceFrame() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(800, 800); 
     setVisible(true); 
     setLayout(new BorderLayout()); 
     face = new FaceCanvas(); 
     add(face, BorderLayout.CENTER); 
    } 

    public static void main(String args[]) { 
     JFrame faceFrame = new FaceFrame(); 
    } 

} 

class FaceCanvas extends Canvas 
{ private int xpos, ypos; 
    public FaceCanvas() 
    { 
     setBackground(Color.BLUE); 
     setSize(300, 300); 
     xpos = ypos = 50; 
    } 
    public void paint(Graphics g) 
    { // override paint method by re-defining it 
     g.setColor(Color.WHITE); 
     g.drawOval(xpos, ypos, 31, 31); 
     g.drawLine(xpos + 10, ypos + 20, xpos + 20, ypos + 20); 
     repaint(); 
    } 

    class KeyListenerTester extends JFrame implements KeyListener { 

      public KeyListenerTester() { 
      } 

      @Override 
      public void keyTyped(KeyEvent e) { 

       if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

       } 
       if (e.getKeyCode() == KeyEvent.VK_LEFT) { 

       } 

      } 

      @Override 
      public void keyPressed(KeyEvent e) { 

       if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
        addX(-10); 
       } 
       if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
       } 

      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

       } 
       if (e.getKeyCode() == KeyEvent.VK_LEFT) { 

       } 
      } 
    } 

    public void addX(int x) 
    { 
     xpos = xpos + 10; 
     repaint(); 
    } 
} 

回答

1
  • 不要paint方法中添加的KeyListener
  • 不要調用重繪,或者可以稱之爲從內重繪任何方法油漆方法。
  • 儘量避免混合重物(畫布),重量輕(JFrame的)組件,它們與Z排序問題和繪畫
  • 不要叫super.paintXxx
  • 除非你有特別的理由這樣做,避免使用AWT組件,並使用Swing組件代替,你通常得到更好的支持
  • 當改變你的圖形對象之一(面)的狀態下,你應該調用重繪鼓勵UI進行更新
相關問題