【问题标题】:Java using Graphics in a MethodJava 在方法中使用图形
【发布时间】:2014-05-02 18:32:24
【问题描述】:

大家好,我是 Java 的超级新手;我环顾四周,无法找到这个问题的答案。有什么机会可以帮助我吗?

这是我正在努力实现的一个示例。

public class FrameWork extends JFrame implements MouseListener {
... //Irrelevant to the question code
public void mouseClicked(MouseEvent e){

int x = e.getX();
int y = e.getY();
if (x==1 && y==1){
// This is where and when I want to draw GFXDice
}
}}

现在是另一个类,为了便于阅读,所有导入都省略了。

public class Board extends JPanel{
Image GFXDice1; 
public Board() {
ImageIcon Dice1;
Dice1 = new ImageIcon(this.getClass().getResource("GFX/Dice1"));
GFXDice1 = Dice1.getImage();
}

现在是图形部分

public void paint(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(GFXDice, 100, 100, null);
}

现在的问题是 - 我想使用 Class FrameWork 中 Class Board 中的方法 paint - 但无法让它工作 - 有什么想法吗?我正在向任何有想法的人提供无数单位的善业。

【问题讨论】:

  • JPanel 使用paintComponent,第一行代码应该是super.paintComponent
  • 遵循 Java 命名约定。变量名不应以大写字符开头。

标签: java swing jframe mouselistener drawimage


【解决方案1】:

大多数 Swing 绘图的一般方法是通过被动图形。这意味着:

  • 在 JPanel 或 JComponent 的 paintComponent(Graphics g) 方法中自行绘制。
  • 在您的 MouseListener 中更改类的某些字段的状态。在您的 mouseClicked 方法中,您正在设置一些 本地 变量的状态,我建议您改为设置 x 和 y 字段,而不是本地。
  • 然后,当鼠标侦听器完成更改后,在 JPanel 上调用 repaint()
  • 然后在 paintComponent 方法中,使用在鼠标侦听器中更改的那些字段来进行绘图。
  • 不要忘记在您的paintComponent 覆盖中调用super 的paintComponent 方法。
  • 不要忘记阅读有关 Swing 图形的教程以获取要点。

编辑

例如,请看一下我为回复another recent question 而创建的一个小型图形程序。

绘图发生在扩展 JPanel 的主类 SpaceShip 中。我为我的鼠标监听器添加了一个匿名的内部 MouseAdapter 类,在 MouseAdapter 内部,我调用了一个名为 moveIt 的方法,传入 MouseEvent 对象。

   MouseAdapter myMouseAdapter = new MouseAdapter() {
     public void mousePressed(MouseEvent evt) {
        moveIt(evt);
        count = count + 1;
     }

     @Override
     public void mouseDragged(MouseEvent evt) {
        moveIt(evt);
     }
  };
  addMouseListener(myMouseAdapter);
  addMouseMotionListener(myMouseAdapter);
}

moveIt(MouseEvent evt)所做的只是改变myX和myY这两个字段的状态,然后在当前类上调用repaint()

public void moveIt(MouseEvent evt) {
  myY = evt.getY() - sprite.getHeight() / 2;
  myX = evt.getX() - sprite.getWidth() / 2;
  repaint();
}

然后在类的paintComponent 方法中,我首先调用super 的paintComponent 以允许它擦除任何以前的旧过时图像,然后我绘制背景图像,背景,然后我绘制使用myX 的精灵和 myY 变量告诉它在哪里绘制,然后我在由 JPanel 的大小确定的位置绘制一些黄色矩形:

protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  font1 = new Font("Serif", Font.BOLD, 36);
  g.drawImage(background, 0, 0, this);
  g.drawImage(sprite, myX, myY, this);
  g.setColor(Color.yellow);
  int rectCount = 10;
  int height = getHeight() / rectCount;
  int width = 272;
  int x = getWidth() - width;
  for (int i = 0; i < rectCount; i++) {
     int y = i * height;
     g.drawRect(x, y, width, height);
  }
  g.setFont(font1);
  g.drawString(Integer.toString(count), 500, 100);
}

整个过程是这样的:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.Graphics;

import javax.imageio.ImageIO;
import javax.swing.*;

import java.io.IOException;
import java.net.URL;
import java.lang.String;
import java.awt.Font;

@SuppressWarnings("serial")
public class SpaceShip extends JPanel {
   private static final String BACKGROUND_PATH = "http://www.thatsreallypossible.com/"
         + "wp-content/uploads/2012/12/Space-Colonialisation.jpg";
   private static final String SPRITE_PATH = "http://www.pd4pic.com/"
         + "images250_/ufo-flying-saucer-spacecraft-spaceship-alien.png";

   private Font font1;
   int myX = 100;
   int myY = 400;
   int count = 0;
   private BufferedImage background;
   private BufferedImage sprite;

   public SpaceShip() throws IOException {
      URL backgroundUrl = new URL(BACKGROUND_PATH);
      URL spriteUrl = new URL(SPRITE_PATH);
      background = ImageIO.read(backgroundUrl);
      sprite = ImageIO.read(spriteUrl);

      MouseAdapter myMouseAdapter = new MouseAdapter() {
         public void mousePressed(MouseEvent evt) {
            moveIt(evt);
            count = count + 1;
         }

         @Override
         public void mouseDragged(MouseEvent evt) {
            moveIt(evt);
         }
      };
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   public Dimension getPreferredSize() {
      if (background != null) {
         return new Dimension(background.getWidth(), background.getHeight());
      }
      return super.getPreferredSize();
   }

   public void moveIt(MouseEvent evt) {
      myY = evt.getY() - sprite.getHeight() / 2;
      myX = evt.getX() - sprite.getWidth() / 2;
      repaint();
   }


   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      font1 = new Font("Serif", Font.BOLD, 36);
      g.drawImage(background, 0, 0, this);
      g.drawImage(sprite, myX, myY, this);
      g.setColor(Color.yellow);
      int rectCount = 10;
      int height = getHeight() / rectCount;
      int width = 272;
      int x = getWidth() - width;
      for (int i = 0; i < rectCount; i++) {
         int y = i * height;
         g.drawRect(x, y, width, height);
      }
      g.setFont(font1);
      g.drawString(Integer.toString(count), 500, 100);
   }

   public static void main(String[] args) {
      JFrame frame = new JFrame("Basic Game");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      SpaceShip ex;
      try {
         ex = new SpaceShip();
         frame.getContentPane().add(ex);
         frame.pack();
         frame.setResizable(false);
         frame.setVisible(true);
         ex.requestFocus();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

【讨论】:

  • @mKorbel:谢谢。我会让你回答这个问题。 :)
  • @mKorbel:好的,我确实给了这个问题一个答案。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2011-12-12
相关资源
最近更新 更多