出于某种原因,当我运行这个程序而不是输出一张卡片选择时,我得到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个代码实例,但我不知道在哪里......
答案 0 :(得分:1)
你没有完全决定如何以及何时执行paintComponent()
,这通常无关紧要,因为所有方法应该做的是绘制组件 。当你执行repaint()
时会调用它,但是当Swing 认为 UI需要更新时它也会被调用(这可能是当窗口改变焦点时,它会被调整大小或一堆其他原因)。
但是,你已经承担了一些不应该实例化Cards
的责任。
将Cards c = new Cards();
从paintComponent()
移到actionPerformed(ActionEvent event)
所属的地方,你应该没问题。
答案 1 :(得分:0)
我怎样才能将变量输入到图形方法中?
一般情况下,你有一个setter方法,然后你将数据保存为类中的一个实例变量,绘制方法可以引用它。这就是setBackground(...),setForeground(...)这样的方法,setFont(...)工作。
所以也许你的课程中有一个类似drawCard(...)
的方法可以得到一张随机卡并设置你的“图像”实例变量。然后在drawCard()方法中调用repaint(),以便组件可以重新绘制自己。
当组件的属性发生变化时,组件而不是应用程序应负责绘制自身。