簡體   English   中英

在Java中更新后調用繪制圖形

[英]calling a paint graphic after update in 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");
    }
}

您的代碼有兩個問題。 首先,您將JPanel放置為JFrame中的主窗口小部件,但是隨后您重寫了JFrame本身的paint方法,並且從不將調用委派給超類,因此不會呈現JPanel。 您可能想要做的是將矩形的圖形移動到JPanel子類中,該子類是框架的主要子窗口小部件。 然后,在keyReleased方法內部,調用子控件的repaint方法。 每次釋放鍵之后,子面板將被告知需要重新粉刷。 刪除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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM