我的程序一直生成四次?

时间:2015-03-17 04:22:55

标签: java arrays random

出于某种原因,当我运行这个程序而不是输出一张卡片选择时,我得到3,有时是4。

我正在尝试从数组列表中选择一个名称将其包含在路径中,然后输出图像,您可以看到系统输出的结果。

下面是代码:

public class Main {

public static void main (String[] args) {

    Main.createScreen();

}

public static void createScreen() {

    JFrame p = new JFrame("Angora Realms");
    p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GameGUI g = new GameGUI();
    p.add(g);
    p.setLocationRelativeTo(null);
    p.pack();
    p.setVisible(true);

    }
}

这是我创建GUI和绘画的地方:

@SuppressWarnings("serial")
public class GameGUI extends JPanel implements ActionListener {

public Button drawCard = new Button("Draw Card");

public GameGUI() {
    drawCard.addActionListener(this);
    add(drawCard);
}

@Override
public void actionPerformed(ActionEvent event) {

    Object cause = event.getSource();

    if (cause == drawCard) {
        System.out.println("Ay");
        repaint();
    }
}


@Override
public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Cards c = new Cards();
    g.drawImage(c.getImage(), 0, 0, 450, 700, this);
    }
}

这是我选择加载哪张卡的地方:

public class Cards {

static Random random = new Random();

public static String getCard() {

    String card = null;
    String[] possibleCards = new String[] {"Cheetah", "Lion"};

    card = possibleCards[random.nextInt(2)];
    System.out.println(card);

    return card;

}

public Image getImage() {

    Image img = null;

    try {
    img = ImageIO.read(getClass().getResource("/dev/angora/images/plains/" + Cards.getCard() + ".png"));
    } 
    catch (IOException e)  {
    e.printStackTrace();
    }

    return img;
}

}

当我运行代码时,我获得了猎豹和狮子随机变体的4个系统打印输出。我之前被告知我实际上在某处创建了3个代码实例,但我不知道在哪里......

2 个答案:

答案 0 :(得分:1)

你没有完全决定如何以及何时执行paintComponent(),这通常无关紧要,因为所有方法应该做的是绘制组件 。当你执行repaint()时会调用它,但是当Swing 认为 UI需要更新时它也会被调用(这可能是当窗口改变焦点时,它会被调整大小或一堆其他原因)。

但是,你已经承担了一些不应该实例化Cards的责任。

Cards c = new Cards();paintComponent()移到actionPerformed(ActionEvent event)所属的地方,你应该没问题。

答案 1 :(得分:0)

  

我怎样才能将变量输入到图形方法中?

一般情况下,你有一个setter方法,然后你将数据保存为类中的一个实例变量,绘制方法可以引用它。这就是setBackground(...),setForeground(...)这样的方法,setFont(...)工作。

所以也许你的课程中有一个类似drawCard(...)的方法可以得到一张随机卡并设置你的“图像”实例变量。然后在drawCard()方法中调用repaint(),以便组件可以重新绘制自己。

当组件的属性发生变化时,组件而不是应用程序应负责绘制自身。