2016-07-13 3 views
0

Problem:Aufruf einer Farbe Grafik nach dem Update in java

Nach jedem Tastendruck von w, a, s oder die Benutzer x d und y sollte geändert werden und der Platz auf der x- und y Bedeutung hingewiesen, dass Die Grafik wird nicht aktualisiert. Meine Frage ist, wie aktualisieren Sie es? Ich habe versucht, Repaint überall und auf jede mögliche Weise zu verwenden und fange an zu denken, dass das nicht das Problem ist. Kann mir jemand sagen, was ich falsch mache oder wie ich das Problem beheben kann? Ich bin ziemlich neu in Java, also entschuldige mich, wenn ich einen wirklich einfachen Fehler gemacht habe.

Code:

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

Der Code, den Sie uns zur Verfügung gestellt haben, ruft die Farbmethode an keiner Stelle auf, die benötigt wird. – ItzBenteThePig

+0

Ich würde wahrscheinlich Spielschleifen auf Google – ItzBenteThePig

+0

@ItzBenteThePig nachschlagen und wie ist das gemacht? – Taka

Antwort

2

ein paar Probleme mit Ihrem Code Es gibt keine. Zuerst legen Sie ein JPanel als primäres Widget in den JFrame, aber Sie überschreiben dann die paint Methode des JFrame selbst und delegieren niemals die Aufrufe an die Superklasse, damit Ihr JPanel nicht gerendert wird. Wahrscheinlich möchten Sie die Zeichnung des Rechtecks ​​in eine JPanel-Unterklasse verschieben, die das Haupt-Child-Widget Ihres Frames ist. Dann setzen Sie innerhalb Ihrer keyReleased Methode einen Anruf an die repaint Methode des Kinderwidgets ein. Nach jeder Schlüsselfreigabe wird dem untergeordneten Panel mitgeteilt, dass es neu streichen muss. Entfernen Sie die Farbe Methode des JFrame und verwenden Sie den Standard.

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

Wenn Sie ein Beispiel von dem, was Sie sagen, in einem Codebeispiel Ich werde dich bis zum Knochen lieben: p – Taka

+0

<3 Sie sind die besten – Taka

+0

Ich habe eine kurze Frage, in Ihrem Beispiel gibt es einen Teil, der ständig geloopt wird Denn ich brauche einen Hintergrundprozess, der etwas macht – Taka

Verwandte Themen