从线程追加JTextArea?

时间:2015-11-21 20:57:22

标签: java multithreading swing jtextarea runnable

我试图在我的gui类中添加一个文本区域,其中包含来自另一个运行线程的控制器类的信息。

我对一般的线程感到有点困惑,并且对于为什么这不起作用感到困惑。

这是跟踪:

  

线程“Thread-1”中的异常java.lang.NullPointerException at   blackjack.Server.DealerForm.appendDealerBox(DealerForm.java:86)at   blackjack.Server.DealerController.shuffleDeck(DealerController.java:42)     在blackjack.Server.DealerController.run(DealerController.java:116)     在java.lang.Thread.run(Thread.java:745)

所以它不喜欢shuffleDeck中的append函数,但我不确定原因。

感谢您的帮助。

DealerForm.java

public class DealerForm extends javax.swing.JFrame {
public static boolean gameStarted;
public static boolean startGameButton = false;
/**
 * Creates new form DealerForm
 */
public DealerForm() 
{
    setTitle("Dealer");
    initComponents();

}

public static boolean getStartGame()
{
    return startGameButton;
}
private void initDealer()
{

    ServerSocket servsocket = null;
    try
    {
        servsocket = new ServerSocket(7776);

    }
    catch(IOException ex)
    {
        DealerForm.appendDealerBox(ex.toString());

        ex.printStackTrace();
    }
    gameStarted = false;
    DealerController dealer = new DealerController();
    new Thread(dealer).start();

    while(gameStarted = false)
    {

        Socket socket = null;
        try
        {
            socket = servsocket.accept();

        }
        catch(IOException ex)
        {
            DealerForm.appendDealerBox("Player Disconnected\n");

            ex.printStackTrace();
        }

        PlayerController player = new PlayerController(socket, dealer);

        dealer.addPlayer(player);

        DealerForm.appendDealerBox("Player: " + player.toString() + "Connected \n");

    }


}

public static void appendDealerBox(String message)
{
    DealerTextArea.append(message);
}

public static void disableStartGameButton()
{
    StartGameButton.setVisible(false);
}
public void enableStartGameButton()
{
    StartGameButton.setVisible(true);
}



/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    DealerTextArea = new javax.swing.JTextArea();
    playerCountLabel = new javax.swing.JLabel();
    playerCount = new javax.swing.JLabel();
    StartGameButton = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    DealerTextArea.setColumns(20);
    DealerTextArea.setRows(5);
    jScrollPane1.setViewportView(DealerTextArea);

    playerCountLabel.setText("Player Count:");

    playerCount.setText("0");

    StartGameButton.setText("Start Game");
    StartGameButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            StartGameButtonActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1)
            .addContainerGap())
        .addGroup(layout.createSequentialGroup()
            .addGap(21, 21, 21)
            .addComponent(playerCountLabel)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(playerCount)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 395, Short.MAX_VALUE)
            .addComponent(StartGameButton)
            .addGap(66, 66, 66))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 288, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(playerCountLabel)
                    .addComponent(playerCount))
                .addComponent(StartGameButton))
            .addContainerGap(77, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void StartGameButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                
    startGameButton=true;
}                                               

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */


    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new DealerForm().setVisible(true);
        }
    });

    ServerSocket servsocket = null;
    try
    {
        servsocket = new ServerSocket(7776);

    }
    catch(IOException ex)
    {
        DealerForm.appendDealerBox(ex.toString());
        ex.printStackTrace();
    }
    gameStarted = false;
    DealerController dealer = new DealerController();
    new Thread(dealer).start();

    while(gameStarted = false)
    {

        Socket socket = null;
        try
        {
            socket = servsocket.accept();

        }
        catch(IOException ex)
        {
            DealerForm.appendDealerBox("Player Disconnected\n");

            ex.printStackTrace();
        }

        PlayerController player = new PlayerController(socket, dealer);

        dealer.addPlayer(player);

        DealerForm.appendDealerBox("Player: " + player.toString() + "Connected \n");

    }


}

// Variables declaration - do not modify                     
public static javax.swing.JTextArea DealerTextArea;
public static javax.swing.JButton StartGameButton;
private javax.swing.JScrollPane jScrollPane1;
public javax.swing.JLabel playerCount;
private javax.swing.JLabel playerCountLabel;
// End of variables declaration                   

DealerController.java

 public class DealerController implements Runnable
{
    Card card;
    private ArrayList<Card> deck;
    volatile ArrayList<PlayerController> players;
    ArrayList<Integer> playerCardValues;
    volatile Iterator<PlayerController> iterator;
    String anyMessage = "";
    public boolean startGame = false;

    //Fills deck with each type of card from enum CardList four times to represent a 52 card deck
    private void shuffleDeck()
    {
        deck = new ArrayList<Card>();
        for(CardList thisCard:CardList.values())
        {
            card = new Card(thisCard);
            deck.add(card);
            card = new Card(thisCard);
            deck.add(card);
            card = new Card(thisCard);
            deck.add(0, card);
            card = new Card(thisCard);
            deck.add(2, card);
        }
        DealerForm.appendDealerBox("Number of cards in current Deck:" + deck.size() + "\n");

    }

    //if less than 5 players, allows the player to join.
    public void addPlayer(PlayerController player)
    {
        if(players.size() < 5)
        {
            players.add(player);
            DealerForm.appendDealerBox("Player joined the game\n");
        }
        else
        {
            player.sendMessage("Sorry, too many players or game has already started\n");
        }
    }

    //gives player random card
    public Card dealCard()
    {
        Random random = new Random(System.currentTimeMillis());
        int i = random.nextInt(deck.size());
        card = deck.get(i);
        deck.remove(i);
        return card;
    }

    //Disconnects player
    public void removePlayer(Iterator iterator)
    {

        DealerForm.appendDealerBox("Player disconnected\n");
        iterator.remove();
    }





   @Override
    public void run()
    {
        playerCardValues = new ArrayList<>();
        players = new ArrayList<>();

        while (true) 
        {
            //DealerForm.appendDealerBox("Press Start to begin game! \n");
            if (startGame = false)
            {

                System.out.println("I am inside IF Statement");
                return;
            }
            else
            {
                System.out.println("Test entered Else");

                for (PlayerController pl : players) 
                {
                    pl.sendMessage("START");
                    System.out.println("I sent start");
                }

                DealerForm.gameStarted = true;
                iterator = players.iterator();

                while (iterator.hasNext()) 
                {
                    PlayerController pl = iterator.next();
                    pl.sendMessage("BET");
                    pl.setBet(iterator);
                }
                shuffleDeck();
                iterator = players.iterator();

                while (iterator.hasNext()) 
                {
                    PlayerController pl = iterator.next();
                    pl.sendCard();
                    pl.sendCard();
                }
                iterator = players.iterator();

                while (iterator.hasNext()) 
                {
                    PlayerController pl = iterator.next();
                    pl.sendMessage("DECIDE");
                    pl.getDecision(iterator);
                }

                for (PlayerController pl : players) 
                {
                    if (pl.getPlayerCardValue() > 21) 
                    {
                        pl.sendMessage("LOSE");
                        pl.sendPlayerCount(players.size());
                    } 
                    else 
                    {
                        playerCardValues.add(pl.getPlayerCardValue());
                    }
                }

                Collections.sort(playerCardValues);
                for (PlayerController pl : players) 
                {
                    if (pl.getPlayerCardValue() == playerCardValues.get(playerCardValues.size() - 1)) 
                    {
                        pl.sendMessage("WIN");
                        pl.sendPlayerCount(players.size());
                    }
                    else 
                    {
                        pl.sendMessage("LOSE");
                        pl.sendPlayerCount(players.size());
                    }
                }
                for (PlayerController pl:players)
                {
                    pl.newGame();
                }

                DealerForm.gameStarted = false;
                playerCardValues = new ArrayList<>();
            }

        }
    }
}

0 个答案:

没有答案
相关问题