java - Jlist 和 NullPointerException

标签 java swing nullpointerexception jlist

我正在为类做这件事,但我在 Jlists 方面遇到了很多麻烦。我以为我终于弄清楚如何使用列表数据模型更新它们,但它仍然不起作用。

请帮忙。

类(class)给我带来了麻烦:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.lang.*;

public class ClubDriverWindow extends JPanel implements ActionListener{
    private ArrayList playerList;
    private DefaultListModel playerListModel;

    private String[] secondPlayerItems = new String[1];
    private String[] firstPlayerItems = new String[1];
    private String[] players1Items = new String[1];
    private String[] players2Items = new String[1];
    private String[] retirePlayerItems = new String[1];
    private String[] jcomp12Items = new String[1];
    private String[] restorePlayerItems = new String[1];

    private JTextArea players;
    private JComboBox secondPlayer;
    private JComboBox firstPlayer;
    private JButton player1Win;
    private JButton player2wins;
    private JButton draw;
    private JButton exit;
    private JComboBox players1;
    private JComboBox players2;
    private JTextArea jcomp10;
    private JComboBox retirePlayer;
    private JList jcomp12;
    private JComboBox restorePlayer;
    private JButton retireButton;
    private JButton restoreButton;
    private JTextArea jcomp16;
    private JTextField addPlayer;
    private JButton addButton;

    public ClubDriverWindow() {
        playerList = new ArrayList<Player>();
        Player starter = new Player ("Starter");
        playerList.add(starter);
        playerList.add(starter);
        playerList.add(starter);
        playerList.add(starter);
        playerList.add(starter);
        playerListModel = new DefaultListModel<String>();

        updatePlayers();

        //construct components
        players = new JTextArea (5, 5);
        secondPlayer = new JComboBox (secondPlayerItems);
        secondPlayer.addActionListener(this); 
        secondPlayer.setActionCommand("secondPlayerComboBox");
        firstPlayer = new JComboBox (firstPlayerItems);
        player1Win = new JButton ("Win");
        player2wins = new JButton ("Win");
        draw = new JButton ("Draw");
        exit = new JButton ("Exit");
        exit.addActionListener(this);;
        exit.setActionCommand("exit");
        players1 = new JComboBox (players1Items);
        players2 = new JComboBox (players2Items);
        jcomp10 = new JTextArea (5, 5);
        retirePlayer = new JComboBox (retirePlayerItems);
        jcomp12 = new JList (playerListModel);
        restorePlayer = new JComboBox (restorePlayerItems);
        retireButton = new JButton ("Retire");
        restoreButton = new JButton ("Restore");
        jcomp16 = new JTextArea (5, 5);
        addPlayer = new JTextField (5);
        addButton = new JButton ("Add Player");
        addButton.addActionListener(this);
        addButton.setActionCommand("addPlayer");

        //set components properties
        players.setToolTipText ("This is a leaderboard of players");
        secondPlayer.setToolTipText ("Choose a Player");
        firstPlayer.setToolTipText ("Choose a player");
        player1Win.setToolTipText ("Player 1 wins");
        player2wins.setToolTipText ("Player2 Wins");
        draw.setToolTipText ("No victor");
        exit.setToolTipText ("Help, I am trapped in a JButton!");
        players1.setToolTipText ("Choose a Player");
        players2.setToolTipText ("Choose a Player");
        retirePlayer.setToolTipText ("CHoose a Player");
        restorePlayer.setToolTipText ("Choose a player");
        retireButton.setToolTipText ("Set a player aside (for now)");
        restoreButton.setToolTipText ("Click here to bring a player back");
        addButton.setToolTipText ("Click here to add a new player");

        //adjust size and set layout
        setPreferredSize (new Dimension (784, 508));
        setLayout (null);

        //add components
        add (players);
        add (secondPlayer);
        add (firstPlayer);
        add (player1Win);
        add (player2wins);
        add (draw);
        add (exit);
        add (players1);
        add (players2);
        add (jcomp10);
        add (retirePlayer);
        add (jcomp12);
        add (restorePlayer);
        add (retireButton);
        add (restoreButton);
        add (jcomp16);
        add (addPlayer);
        add (addButton);

        //set component bounds (only needed by Absolute Positioning)
        players.setBounds (40, 40, 300, 300);
        secondPlayer.setBounds (-170, 295, 100, 75);
        firstPlayer.setBounds (-185, 355, 100, 75);
        player1Win.setBounds (45, 405, 100, 25);
        player2wins.setBounds (215, 405, 100, 25);
        draw.setBounds (135, 445, 100, 25);
        exit.setBounds (675, 5, 100, 25);
        players1.setBounds (45, 365, 100, 25);
        players2.setBounds (215, 365, 100, 25);
        jcomp10.setBounds (380, 0, 2, 600);
        retirePlayer.setBounds (415, 60, 100, 25);
        jcomp12.setBounds (-150, 345, 100, 75);
        restorePlayer.setBounds (415, 110, 100, 25);
        retireButton.setBounds (595, 60, 100, 25);
        restoreButton.setBounds (595, 110, 100, 25);
        jcomp16.setBounds (-150, 300, 100, 75);
        addPlayer.setBounds (415, 165, 100, 25);
        addButton.setBounds (595, 165, 100, 25);
    }

    public static void main (String[] args) {
        JFrame frame = new JFrame ("MyPanel");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new ClubDriverWindow());
        frame.pack();
        frame.setVisible (true);
    }

    public void wonGame(Player winner, Player loser){
        double wRating = winner.getRating();
        double lRating = loser.getRating();
        double pointModifier = (lRating/wRating);
        wRating += ((pointModifier*10)+0.5);
        lRating -= ((pointModifier*10)-0.5);
        winner.setRating(wRating);
        loser.setRating(lRating);
        winner.setWins(winner.getWins() + 1);
        loser.setLosses(winner.getLosses() + 1);
    }

    public void drawGame(Player player1, Player player2){
        double p1Rating = player1.getRating();
        double p2Rating = player2.getRating();
        double p1modifier = ((p1Rating-p2Rating)/p1Rating);
        double p2modifier = ((p2Rating-p1Rating)/p2Rating);
        p1Rating += ((p1modifier*-5));
        p2Rating += ((p2modifier*-5));
        player1.setRating(p1Rating);
        player2.setRating(p2Rating);
        player1.setDraws(player1.getDraws() + 1);
        player2.setDraws(player2.getDraws() + 1);
    }

    public void actionPerformed(ActionEvent e){
        if (e.getActionCommand().equals("secondPlayerComboBox")){
        }
        else if (e.getActionCommand().equals("exit")){
            System.exit(0);
        }
        else if (e.getActionCommand().equals("addPlayer")){
            addNewPlayer();
        }
    }

    public void addNewPlayer(){

    }

    public void updatePlayers(){
        int size = playerList.size();
        playerListModel.clear();
        for (int j = 0; (j < (size-1)); j++){
            playerListModel.add(j,((Player)playerList.get(j)).getName());
        }
        jcomp12.setModel(playerListModel);
    }
}

相关玩家类别:

public class Player
{
    //private Record playerRecord
    private double rating;
    private final String ID = "";
    private int ranking;
    public String name;
    private int losses;
    private int wins;
    private int draws;

    public Player(String name){
        rating = 1000.0;
        ranking = 0;
        name = name;
        losses = 0;
        wins = 0;
        draws = 0;
    }

    int getTotalGames(){
        int t = (wins+draws+losses);
        return t;
    }

    float getWinLossRatio(){
        float r = (wins/losses);
        return r;
    }

    int getWins(){
        return wins;
    }

    int getLosses(){
        return losses;
    }

    int getDraws(){
        return draws;
    }

    double getRating(){
        return rating;
    }

    String getID(){
        return ID ;
    }

    double getRanking(){
        return ranking;
    }

    String getName(){
        return name;
    }

    void setWins(int newWins){
        wins = newWins;
    }

    void setLosses(int newLosses){
        losses = newLosses;
    }

    void setDraws(int newDraws){
        draws = newDraws;
    }

    void setRating(double newRating){
        rating = newRating;
    }

    void setName(String newName){
        name = newName;
    }
}

错误:

java.lang.NullPointerException
    at ClubDriverWindow.updatePlayers(ClubDriverWindow.java:194)
    at ClubDriverWindow.<init>(ClubDriverWindow.java:52)
    at ClubDriverWindow.main(ClubDriverWindow.java:144)

请帮忙, 谢谢。

最佳答案

也许你应该改变

private ArrayList playerList;
private DefaultListModel playerListModel;

private ArrayList<Player> playerList;
private DefaultListModel<String> playerListModel;

对于这一部分,

Player starter = new Player ("Starter");
playerList.add(starter);
playerList.add(starter);
playerList.add(starter);
playerList.add(starter);
playerList.add(starter);

如果您想要 5 个不同的玩家,则需要一一创建它们,例如

Player starter = null;
for(int i = 0; i < 5; i++) {
    starter = new Player("Starter" + i);
    playerList.add(starter);
}


好的,这就是 NullPointerException 部分的答案。

对于您的NullPointerException,您需要在初始化jcomp12后调用updatePlayers();..

 jcomp12 = new JList (playerListModel);
 // ....
 updatePlayers();

否则 jcomp12 在 updatePlayers() 方法中将为 null!

关于java - Jlist 和 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553311/

相关文章:

Java8 : About Functional Interface

java - 传递多个参数的可观察更新

java - 尝试获取 Activity 的 DefaultSharedPreferences 时出现 NullPointerException

Java 打印 : Windows vs Linux

java - mapreduce 二次排序不起作用

java - Jslider,没有出现在我的框架上

Java:完全禁用任何 Swing 不需要的蜂鸣声的方法?

Java - 如何在 JTextArea 中拆分整个单词

java - Spring @Autowired bean 没有初始化;空指针异常

java - 我应该如何解决我的 NullPointerException?