从其他类

时间:2016-04-14 23:53:10

标签: java image swing class

对于我正在做的项目,我必须创建2个类,其中一个创建一个JFrame,另一个包含必须添加到JFrame的图像。

我的JFrame创建类名为Driver,如下所示:

import javax.swing.JFrame;
import javax.swing.JTextField;
public class Driver {
    private JFrame win;
    private Animals animals = new Animals();
    private BirdButton nextBtn, enlargeBtn, shrinkBtn, moveToBtn;
    private JTextField field;

    public Driver() {
        win = new JFrame("Angry Animal Name Game");
        win.setBounds(100, 100, 600, 600);
        win.setLayout(null);
        win.setVisible(true);
        nextBtn = new BirdButton( "NEXT", 10, 10, animals);
        win.add(nextBtn, 0);
        enlargeBtn = new BirdButton( "ENLARGE", 10, 60, animals);
        win.add(enlargeBtn, 0);
        shrinkBtn = new BirdButton( "SHRINK", 10, 110, animals);
        win.add(shrinkBtn, 0);
        field = new JTextField();
        field.setBounds(10, 250, 100, 20);
        win.add(field, 0);
        moveToBtn = new BirdButton( "MOVETO", 10, 275, animals, field);
        win.add(moveToBtn, 0);
        win.add(animals, 0);
        animals.recenter();
        win.repaint();
    }
}

然后我有一个单独的类动物,其中包含一些鸟类的图像。我喜欢让这个图像显示在我的JFrame上,但我的代码似乎没有那么热。动物看起来像这样:

public class Animals extends Image {
    public Circle selector;
    public Image birds;

    public Animals(){
         birds = new Image(225,200,150,200);
         birds.setImage("AngryBirds.png");
         selector = new Circle(70,70,birds.getX(),birds.getY());
         selector.setThickness(5);
         birds.add(selector,0);
    } 

    public void recenter(){
         birds.setLocation((600-birds.getWidth()/2),(600-birds.getHeight()/2));
    }
}

由于动物扩展了图像,我能否使用此命令使动物成为图像本身或我必须做什么?我不应该以任何方式修改Driver。

由于

经过一些回复,我编辑了我的动物代码:

public class Animals extends Image {
    public Circle selector;

    public Animals(){
         new Image(225,200,150,200);
         setImage("AngryBirds.png");
         selector = new Circle(70,70,this.getX(),this.getY());
         selector.setThickness(5);
         this.add(selector,0);
    } 

    public void recenter(){
         this.setLocation((600-this.getWidth()/2),(600-this.getHeight()/2));
    }
}

1 个答案:

答案 0 :(得分:3)

首先,确保动物不会延伸图像。动物不是任何形状或形式的图像,因此不应扩展它。您还需要澄清您正在使用的Image类。 Swing组件将使用从java.awt.Image派生的图像,如果您有自己的名为Image的类,并且它看起来像您(例如birds = new Image(225,200,150,200);),请立即重命名以避免名称冲突。

现在要让JFrame使用图像,你必须创建它可以使用的图像,通常是BufferedImage,通常通过ImageIO.read(...)获得 - 我看到你的代码中没有使用BufferedImage,所以如果我是你我从那里开始。

看起来你的Animals类不应该扩展任何类型的图像,而是应该扩展某种类型的Swing组件,因为你似乎将它添加到你的JFrame中。

其他问题:

  • 您的驱动程序类代码使用null布局。虽然null布局和setBounds()似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件大小,它们是增强或维护的皇室女巫,当它们放置在滚动窗格中时它们会完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕。你的老师创建了这门课吗?如果是这样,我不得不怀疑他们是否知道他们在做什么。