1

所以我和我的朋友正在制作一个非常基本的游戏来娱乐,它将是一个自上而下(大约 45 度角),其中有一个伐木工人砍伐树木。我知道非常基本且有点蹩脚,但我们刚刚进入半高级Java。

首先,我们决定需要树的精灵,但我们意识到无论如何它都是一个在树周围有白色像素的矩形,但这会切掉部分背景图像。所以我们想要获取每个白色的像素(空白/负空间),然后让这些像素透明。为此,我们查看了大量代码,我们看到最多的是下面的代码,它有效,但我不太明白。

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class simpleFrame extends JFrame {
   JPanel mainPanel = new JPanel() {
      ImageIcon originalIcon = new ImageIcon("image.png");
      ImageFilter filter = new RGBImageFilter() {
         int transparentColor = Color.white.getRGB() | 0xFF000000;
         public final int filterRGB(int x, int y, int rgb) {
            if ((rgb | 0xFF000000) == transparentColor) {
               return 0x00FFFFFF & rgb;
            } else {
               return rgb;
            }
         }
      };
      ImageProducer filteredImgProd = new FilteredImageSource(originalIcon.getImage().getSource(), filter);
      Image transparentImg = Toolkit.getDefaultToolkit().createImage(filteredImgProd);
      public void paintComponent(Graphics g) {
         g.setColor(getBackground());
         g.fillRect(0, 0, getSize().width, getSize().height);
         g.drawImage(transparentImg, 140, 10, this);
      }
   };
   public simpleFrame() {
      super("Transparency Example");

      JPanel content = (JPanel)getContentPane();
      mainPanel.setBackground(Color.black);
      content.add("Center", mainPanel);
   }
   public static void main(String[] argv) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            simpleFrame c = new simpleFrame();
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c.setSize(700,700);
            c.setVisible(true);
         }
      });
   }
}

所以我们不完全理解的是为什么在第 6 行声明 JPanel 之后有括号,那么我不知道第 6-16 行是怎么回事。就像在括号之间一样,右括号后面有一个分号。我不知道它是如何工作的,除了声明 JPanel 的结构之外,每个命令行都放在一边,JPanel mainPanel = new JPanel() { };

我试图实现这一点,以便我可以将图像导入我的 JPanel 类,然后使所有负空间透明,然后绘制它。我似乎无法理解程序的结构以及如何将它实现到一个类中。

我的代码如下:

public class Frame extends JPanel   {
    /*
     * This is the JPanel in which I want to add the transparent image to a JPanel
     * then add the JPanel object,"Frame", above in a JFrame declared in my
     * class above
     */
    public Frame()  {
        JPanel jp = new JPanel();
        jp.setSize(300,300);
        jp.setVisible(true);
        circle = new BufferedImage();           
        try {circle = ImageIO.read(new File("circle.PNG"));}
        catch (IOException ex) {}
    }
    public void paintComponents(Graphics g) {
        super.paintComponents(g);
        g.drawImage(circle,0,0,300,300, null);
        g.drawRect(50, 50, 50, 50);
    }

}

它只是导入图像,使其透明,然后将其绘制在 JPanel 上的测试代码。我们只是想了解执行此操作的最佳方法,而我发现的代码(第一个代码块)似乎可以很好地完成这项工作,但我们无法找出将其实施到我们的代码中的最佳方法。

提前致谢,

罗比和尼克

4

1 回答 1

0

您的示例块中的代码JPanel正在做的是在实例化 JPanel 时立即声明 JPanel 的类。这是一种编码速记。这样做,他们不必在新的 .java 文件中为 JPanel 编写正式的新命名类:类的整个定义就在那里。如果您将其视为 Java 类定义,我相信它会更有意义。

如果你把所有的东西都拿出来放在一个正式的 Java 类中,继承自 JPanel,它应该可以工作。他们正在做的正式名称称为实现匿名类 ( http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html )。我通常不这样做,因为它使代码更难阅读,但这是允许的。

高温高压

于 2013-05-08T19:05:51.353 回答