java - BlackJack 窗口程序不会显示

标签 java jframe actionlistener blackjack

我已分配使用老师提供的 JFrame 和卡片图像编写一个基本的 BlackJack 窗口程序。我按照我认为应该有效的方式写下了所有内容,但是当我编译它时它根本没有显示出来。我是不是错过了什么?

当我编译程序时,它成功编译了,但是,在我执行库 BlackJack.java 中的文件后,什么也没有执行,我的程序也没有显示。在命令提示符中,它显示已执行,但屏幕上没有显示 BlackJack/JFrame。

我尝试调整 BlackJack 类和 MyJFrame 类,以便 JFrame 立即执行,但它似乎不起作用。 在之前的作业中,我们需要为这个 BlackJack 类编写一个 JFrame,我的工作得很好。所以我觉得 BlackJack 工具引起了问题。

注意:我们有一个名为 DeckOfCards 的 java 文件和供卡片图像使用的 gif 文件

import javax.swing.*;
import java.awt.*; 
import java.awt.event.*;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Vector;
public class BlackJack extends JFrame implements ActionListener
{
private JLabel[] lblPlayer = new JLabel[8];
private JLabel[] lblDealer = new JLabel[8];

private JPanel pnlPlayDeal = new JPanel(new GridLayout(2,8)); 

private DeckOfCards deck = new DeckOfCards();

private Vector <String> playerCardNames = new Vector<String>();
private Vector <String> dealerCardNames = new Vector<String>();

private ImageIcon[] icoPlayerHand = new ImageIcon[8];
private ImageIcon[] icoDealerHand = new ImageIcon[8];

private JButton btnDeal = new JButton("Deal");
private JButton btnPlayer = new JButton("Player");
private JButton btnDealer = new JButton("Dealer");
private JButton btnNew = new JButton("New");
private JButton btnAuthor = new JButton("Author");

private JPanel pnlButtons = new JPanel(new FlowLayout());

private int count = 1;
private int playerval = 0;
private int dealerval = 0;

public void MyJFrame()
{
    for(int i=0;i<8;i++)
    {
        lblPlayer[i] = new JLabel("Player");
        lblDealer[i] = new JLabel("Dealer");
    }
    this.setLocationRelativeTo(null);
    this.setSize(800, 350);
    this.setVisible(true);   
    add(pnlPlayDeal,BorderLayout.CENTER);
    add(pnlButtons,BorderLayout.SOUTH);
    this.addLabels();
    this.addButtons();
    registerListeners();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}    
public void addLabels()
{
    for(int i= 0;i<8;i++)
    {
        pnlPlayDeal.add(lblPlayer[i]);
    }
    for(int i= 0;i<8;i++)
    pnlPlayDeal.add(lblDealer[i]);        
}    
public void addButtons()
{
    pnlButtons.add(btnDeal);
    pnlButtons.add(btnPlayer);
    btnPlayer.setEnabled(false);
    pnlButtons.add(btnDealer);
    btnDealer.setEnabled(false);
    pnlButtons.add(btnNew);
    btnNew.setEnabled(false);
    pnlButtons.add(btnAuthor);
}    
public void registerListeners()
{
    btnDeal.addActionListener(this);
    btnPlayer.addActionListener(this);
    btnDealer.addActionListener(this);
    btnNew.addActionListener(this);
    btnAuthor.addActionListener(this);
}    
public int findRank(String x)
{
    int result=0;
    if(x.startsWith("Two"))
       result=2;
    else if(x.startsWith("Three"))
       result=3;
    else if(x.startsWith("Four"))
        result=4;
    else if(x.startsWith("Five"))
        result=5;
    else if(x.startsWith("Six"))
        result=6;
    else if(x.startsWith("Seven"))
        result=7;
    else if(x.startsWith("Eight"))
        result=8;
    else if(x.startsWith("Nine"))
        result=9;
    else if(x.startsWith("Ten"))
        result=10;
    else if(x.startsWith("Jack"))
        result=10;
    else if(x.startsWith("Queen"))
        result=10;
    else if(x.startsWith("King"))
        result=10;
    else if(x.startsWith("Ace"))
        result=11;
    return result;
}
public int getVal (Vector<String> v)
{
    int total=0;
    Iterator <String> iter = v.iterator();
    while(iter.hasNext())
    {
        total+= findRank(iter.next());
    }
    return total;
}
public void deal()
{
    deck.shuffle();
    playerCardNames.add(deck.deal());
    playerCardNames.add(deck.deal());
    dealerCardNames.add(deck.deal());
    dealerCardNames.add(deck.deal());

    icoPlayerHand[0] = new ImageIcon("cardImages/"
            +playerCardNames.get(0)+".gif");
    icoPlayerHand[1] = new ImageIcon("cardImages/"
            +playerCardNames.get(1)+".gif");
    lblPlayer[0].setIcon(icoPlayerHand[0]);
    lblPlayer[1].setIcon(icoPlayerHand[1]);

    icoDealerHand[0] = new ImageIcon("cardImages/"+
            dealerCardNames.get(0)+".gif");
    icoDealerHand[1] = new ImageIcon("cardImages/card.gif");
    lblDealer[0].setIcon(icoDealerHand[0]);
    lblDealer[1].setIcon(new ImageIcon("cardImages/card.gif"));

    btnDeal.setEnabled(false);
    btnPlayer.setEnabled(true);
    count ++;
}    
public void player()
{
    while(getVal(playerCardNames)<22)
    {
        String choice = JOptionPane.showInputDialog(null, "you have " 
                +getVal(playerCardNames)+" h/s",null);
        if(choice.equalsIgnoreCase("h"))
        {
            playerCardNames.add(deck.deal());
            icoPlayerHand[count] = new ImageIcon("cardImages/"
                    +playerCardNames.lastElement()+".gif");
            lblPlayer[count].setIcon(icoPlayerHand[count]);
            count++;
        }
        else
        break;
    }
    if(getVal(playerCardNames)>21)
    {
        JOptionPane.showMessageDialog(this, "You Busted");
        btnPlayer.setEnabled(false);
        btnNew.setEnabled(true);
    }
    else
    {
        btnPlayer.setEnabled(false);
        btnDealer.setEnabled(true);
    }
}      
public void dealer()
{
    btnDealer.setEnabled(false);
    count=1;
    icoDealerHand[count] = new ImageIcon("cardImages/" 
             +dealerCardNames.lastElement()+".gif");
    lblDealer[1].setIcon(icoDealerHand[count]);
    count ++;
    while(getVal(dealerCardNames)<17)
    {
        dealerCardNames.add(deck.deal());
        icoDealerHand[count] = new ImageIcon("cardImages/" 
                +dealerCardNames.lastElement()+".gif");
        lblDealer[count].setIcon(icoDealerHand[count]);
        count ++;
    }
    if(getVal(dealerCardNames)>21)
        JOptionPane.showMessageDialog(this, "Dealer bust you won");
    else
    whoWon();
    btnNew.setEnabled(true);
}            
public void whoWon()
{
    if(getVal(playerCardNames)>getVal(dealerCardNames))
        JOptionPane.showMessageDialog(this,"You won");
    else
        JOptionPane.showMessageDialog(this,"You lost");
}    
public void newGame()
{
    this.setVisible(false);
    BlackJack game = new BlackJack();
}
public static void main(String[]args)
{
    MyJFrame table= new MyJFrame();
    BlackJack first = new BlackJack();
}
public void actionPerformed(ActionEvent e)
{
    if(e.getSource()==btnAuthor)
        ((JButton)e.getSource()).setText("Conner M");
    if(e.getSource()==btnDeal)
        deal();
    if(e.getSource()==btnPlayer)
        player();
    if(e.getSource()==btnDealer)
        dealer();
    if(e.getSource()==btnNew)
    {
        newGame();             
    }        
}
}

最佳答案

A.分析:

让我们开始手动执行代码,代码的起点是 static void main,我可以在其中看到 MyFrame 的对象正在初始化。然后 BlackJack 的对象正在初始化。

B.问题:

  1. 您的代码中没有声明 MyFrame 类。
  2. Blackjack 扩展了 JFrame,因此您需要通过 setVisible() 方法将其引用设置为可见,该方法在 MyJFrame() 方法中完成(而不是在 BlackJack 的构造函数中完成)。
  3. 方法 newGame() 再次创建一个新的 BlackJack 对象,但您尚未为此创建自己的构造函数。我认为 MyJFrame 方法应该转换为 BlackJack 构造函数。

C.可能的解决方案:

  1. 从 static void main() 中删除 MyJFrame table= new MyJFrame();
  2. 将方法 void MyJFrame() 转换为 BlackJack 的构造函数
  3. 不要在 main() 方法中创建本地 BlackJack 变量“first”,而是将其设为类成员(在 main() 外部声明它)并在 main() 中对其进行初始化。
  4. 由于 BlackJack 的变量现在是类成员,因此在方法 newGame() 中,不要创建新的局部变量“first”,而是这样做:first = new BlackJack();

注意:您的代码可能有更多错误。上述解决方案可能会解决您为什么不显示框架的问题。纠正的方法不止一种,我目前只提供了最好的方法。

关于java - BlackJack 窗口程序不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39782980/

相关文章:

java - 尝试从文本字段获取文本以移动到文本区域

java - 放置在 5 个不同 JPanel 中的 Jbutton 数组中的 Action 监听器

java - 在同一个包中导入一些类

java - 如何使返回类型具有与打印函数相同的输出?

java - 如何根据标题从RecyclerView打开一个项目到另一个项目 - MYSQL 数据库

java - 我正在尝试使用单击的按钮来计算数组中一列数字的平均值

java - 为什么在 Eclipse 中使用窗口生成器创建 GUI 时未实现 ActionListener?

java - 删除android中底部布局和 ScrollView 之间的空格

java - netbean 8.0.2中如何使用代码将jpanel添加到jframe

java - 如何在计算 JLabel 值之前显示 JFrame