简单的图形用户界面 |按下 JButton 时,显示带有由另一个类的方法定义的字符串变量的文本 |请提供调试帮助?


****// --------------------------------
package Practice;
import java.util.Random;
public class Card
{
    Random gen = new Random();
    private Card[] Deck = new Card[60];
    private int i = 0;
    private int drawnCard;
    public static String cardName = "";
    // Constructor to return String variable "cardName",    
    // which is later used by the MTGgui class.
    public String Draw(String cardName)
    {   
        if (i < Deck.length)
        {
            drawnCard = gen.nextInt(5) + 0;
            switch (drawnCard)
            {
            case 0: cardName = "Instant";
            case 1: cardName = "Sorcery";
            case 2: cardName = "Creature";
            case 3: cardName = "Enchantment";
            case 4: cardName = "Land";
            case 5: cardName = "Artifact";
            default: cardName = "Nothing!";
            }
            Card.cardName = this.cardName;
        }
        return Card.cardName;
    }
}
// Card class.
//--------------------------------


// --------------------------------
package Practice;
import javax.swing.JFrame;
public class MTGInterface extends JFrame
{
    public static void main (String[] args)
    {
        MTGgui MTG = new MTGgui();
        MTG.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MTG.setSize(300, 200);
        MTG.setVisible(true);
    }
}
// Main class.
// --------------------------------


// --------------------------------------------------
package Practice;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
// Importing required assets.
public class MTGgui extends JFrame // Code to set up the user interface.
{
    // JButton variable that appears on-screen.
    private JButton DrawCard;
    // Constructor for this class.
    public MTGgui()
    {
        super("MTG Deck Drawing Simulator : Mega Awesome Edition!!!");
        setLayout(new FlowLayout());
        DrawCard = new JButton("Draw a card");
        add(DrawCard);
        // Building an event handler for actions caused by button.
        HandlerClass Handler = new HandlerClass();
        DrawCard.addActionListener(Handler);
    }
    // Private class within MTGgui for event handling.
    private class HandlerClass implements ActionListener
    {
        // Initializing private String variable that is the same 
        // as the "Card" class' variable - cardName.
        private String card = Card.cardName;
        public void actionPerformed(ActionEvent Event) 
        {
            JOptionPane.showMessageDialog(null, "You drew a(n)" + card);
        }
    }
}
// MTGgui class
//--------------------------------------------------****

实际上,我创建了一个程序,旨在为用户提供包含一个按钮的界面。当按下按钮时,程序应该基于一个简单的随机变量和一个开关箱生成一个字符串,然后显示"你画了一个(n)"。

一切都如预期的那样起作用,除了MTGgui类中的"showDialogMessage"方法在调用时不显示字符串"cardName",它在其各自的类中被定义为另一个名为"card"的私有变量。对如何解决这个问题有什么建议吗?

试试这个:

private class HandlerClass implements ActionListener
{
    // Initializing private String variable that is the same 
    // as the "Card" class' variable - cardName.
    //        private String card = Card.cardName;
    public void actionPerformed(ActionEvent Event) 
    {
        JOptionPane.showMessageDialog(null, "You drew a(n) " + Card.draw());
    }
}

公共类Card{

private static Card[] Deck = new Card[60];
// Constructor to return String variable "cardName",    
// which is later used by the MTGgui class.
public static String draw()
{   
    Random gen = new Random();
    String returningCardName = "";
    int i = 0;
    // i will be always 0...
    if (i < Deck.length)
    {
        int drawnCard = gen.nextInt(5) + 0;
        switch (drawnCard)
        {
        case 0: returningCardName = "Instant"; break;
        case 1: returningCardName = "Sorcery"; break;
        case 2: returningCardName = "Creature"; break;
        case 3: returningCardName = "Enchantment"; break;
        case 4: returningCardName = "Land"; break;
        case 5: returningCardName = "Artifact"; break;
        default: returningCardName = "Nothing!"; break;
        }
    }
    return returningCardName;
}

}

这个解决方案有很多静态/非静态变量/方法,这不是最好的编程方式,但它是有效的。

最新更新