簡體   English   中英

java中的Coding Graphics和KeyListener

[英]Coding Graphics and KeyListener in java

我想知道如何正確使用圖形庫以及JAVA中的Keylistener。 下面是我的代碼,我相信我做錯了,因為Window是空白的,沒有Oval。 請幫幫我!

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Game extends JFrame implements KeyListener{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    int x=100,y=100;

    boolean u,d,r,l;

    public <addKeyListener> void run(){
        setBackground(Color.gray);
        setSize(800,800);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(this);
    }
    public static void main(String[] args) {
        Game game = new Game();
        game.run(); 
        }

    public void paint(Graphics g){
        g.setColor(Color.black);
        g.fillOval(x,y,40,40);
    repaint();
    }
    {


    if(u =true){
    y-=200;

    } 
    if(d = true){
    y+=2;
    }
    if(r = true){
        x-=2;
        }
    if(l = true){
        x+=2;}
    }








    @Override
    public void keyPressed(KeyEvent e) {
    char code = e.getKeyChar();
        if(code == KeyEvent.VK_W){
            u = true;}
            if(code == KeyEvent.VK_A){
                l = true;}
                if(code == KeyEvent.VK_S){
                    d = true;}
                    if(code == KeyEvent.VK_D){
                        r = true;}

    }



    @Override
    public void keyReleased(KeyEvent e) {
        char code = e.getKeyChar();
        if(code == KeyEvent.VK_W){
            u = false;}
            if(code == KeyEvent.VK_A){
                l = false;}
                if(code == KeyEvent.VK_S){
                    d = false;}
                    if(code == KeyEvent.VK_D){
                        r = false;}

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

}
  1. 你直接在JFrame中繪圖,這是一件很危險的事情(正如你所發現的那樣)。
  2. 你不是在你的繪畫覆蓋中調用super的paint(...)方法,而是阻止JFrame執行它自己需要做的繪制。
  3. 你在繪畫方法中調用repaint() - 永遠不要這樣做。
  4. 你還沒有在Swing教程中閱讀這幅畫。

代替:

  1. 在JPanel的paintComponent方法中繪制。
  2. 在覆蓋中調用super的paintComponent。
  3. 使用Key Bindings而非KeyListeners(Google將在本教程中介紹如何使用這些)。

查看Swing Info鏈接以獲取教程和資源的鏈接。

例如

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class SimpleAnimationEg extends JPanel {
   private static final int OVAL_WIDTH = 20;
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private int x = 0;
   private int y = 0;

   public SimpleAnimationEg() {
      addKeyBindings();
   }

   private void addKeyBindings() {
      InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
      ActionMap actionMap = getActionMap();

      KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(0, -1));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(0, 1));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(-1, 0));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(1, 0));
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setColor(Color.RED);
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.fillOval(x, y, OVAL_WIDTH, OVAL_WIDTH);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class MyAction extends AbstractAction {
      private int xDirection;
      private int yDirection;

      public MyAction(int xDirection, int yDirection) {
         this.xDirection = xDirection;
         this.yDirection = yDirection;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         x += xDirection;
         y += yDirection;
         repaint();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleAnimationEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new SimpleAnimationEg());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

暫無
暫無

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

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