2016-07-13 25 views
0

問題:調用Java的更新後的塗料圖形

的W,A,S每個按鍵後或D的用戶x和y應該改變和廣場上吸引到x和y的含義圖形不更新。我的問題是你如何更新它?我曾嘗試在任何地方以各種可能的方式使用重繪,並開始認爲這不是問題。有人能告訴我我做錯了什麼或者如何解決問題。我對Java很新,所以如果我做了一個非常簡單的錯誤,請原諒我。

代碼:

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class KeyPressDrawing extends JFrame implements KeyListener{ 
    // define variables 
    public static int user_x = 50; 
    public static int user_y = 50; 

    // init 
    public KeyPressDrawing(String s){ 
     super(s); 
     JPanel area = new JPanel(); 
     add(area); 
     setSize(800, 800); 
     setVisible(true); 
     addKeyListener(this); 
     setResizable(false); 
    } 

    // draw 
    public void paint(Graphics g) { 
     g.setColor (Color.black); 
     // x position, y position, width length, height length 
     g.fillRect(KeyPressDrawing.user_x, KeyPressDrawing.user_y, 50, 50); 
     repaint(); 
} 

    // check and change 

    public void keyTyped(KeyEvent e) {} 


    public void keyPressed(KeyEvent e) {} 


    public void keyReleased(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_W) { 
      System.out.println("Up"); 
      KeyPress.user_y -= 20; 

     } 
     if (e.getKeyCode() == KeyEvent.VK_A) { 
      System.out.println("Left"); 
      KeyPress.user_x -= 20; 

     } 
     if (e.getKeyCode() == KeyEvent.VK_S) { 
      System.out.println("Down"); 
      KeyPress.user_y += 20; 

     } 
     if (e.getKeyCode() == KeyEvent.VK_D) { 
      System.out.println("Right"); 
      KeyPress.user_x += 20; 
      } 
     } 

    public static void main(String[] args){ 
     new KeyPressDrawing("Control Panel"); 
    } 
} 
+0

您提供給我們的代碼在任何時候都不會調用paint方法,這是需要的。 – ItzBenteThePig

+0

我可能會在谷歌上查找遊戲循環 – ItzBenteThePig

+0

@ItzBenteThePig,這是怎麼回事? – Taka

回答

2

有幾個與你的代碼的問題。首先,您將Janel作爲JFrame中的主窗口部件放置,但是您會覆蓋JFrame本身的paint方法,並且不會將調用委託給超類,因此不會呈現您的JPanel。你可能想要做的是將矩形的繪圖移動到JPanel子類中,該子類是框架的主子部件。然後,在您的keyReleased方法中,您將調用子控件的重繪爲方法。在每次釋放鑰匙之後,子面板將被告知需要重新繪製。刪除JFrame的paint方法並使用默認值。

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.geom.Ellipse2D; 


public class Sample extends JFrame implements KeyListener { 
    public int user_x; 
    public int user_y; 
    public Canvas canvas; 

    class Canvas extends JPanel{ 
    public Canvas() { 
     setSize(getPreferredSize()); 
     Canvas.this.setBackground(Color.white); 
     user_x = 10; 
     user_y = 10; 
    } 

    @Override 
    public final Dimension getPreferredSize() { 
     return new Dimension(600, 600); 
    } 

    @Override 
    public final void paintComponent(final Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     Ellipse2D circle = new Ellipse2D.Double(0d, 0d, 100d, 100d); 
     g2d.setColor(Color.red); 
     g2d.translate(user_x, user_y); 
     g2d.draw(circle); 
     g2d.fill(circle); 
    } 
    } 

    public Sample() { 
    super("Sample"); 
    setSize(300, 300); 
    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) {System.exit(0);} 
     public void windowOpened(WindowEvent e) {} 
    }); 
    canvas = new Canvas(); 
    getContentPane().add(canvas); 
    addKeyListener(this); 
    } 


// Implementation of java.awt.event.KeyListener 

    public final void keyTyped(final KeyEvent keyEvent) { 

    } 

    public final void keyPressed(final KeyEvent keyEvent) { 

    } 

    public final void keyReleased(final KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_W) { 
     System.out.println("Up"); 
     user_y -= 20; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_A) { 
     System.out.println("Left"); 
     user_x -= 20; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_S) { 
     System.out.println("Down"); 
     user_y += 20; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_D) { 
     System.out.println("Right"); 
     user_x += 20; 
    } 
    //either canvas.repaint or just repaint for the frame will work here 
    repaint(); 
    } 

    public static final void main(final String[] args) { 

    Sample f = new Sample(); 
    f.setVisible(true); 
    } 

} // Sample 
+0

如果您在代碼示例中提供了一個示例,我會愛上您的骨骼:p – Taka

+0

<3您是最好的 – Taka

+0

我有一個快速問題,在您的示例中是否有一部分不斷循環因爲我需要有一個後臺進程正在做某事 – Taka