public void setup(GuiController wham, Game game) {
    removeAll();
    this.game = game;
    // Build score grid.  First column is labels; then 3 columns for each player, with top and bottom row spanning all 3.
    setLayout(new GridBagLayout());
     // Add column names to left.
    GridBagConstraints c = new GridBagConstraints();
    c.weightx = c.weighty = 1.0;
    c.fill = GridBagConstraints.BOTH;
    c.insets = new Insets(1, 1, 1, 1);
    c.anchor = GridBagConstraints.LINE_START;
    c.gridx = 0;
    c.gridy = 0;
    add(makeLabel("", headerColor), c);
    setBackground(backgroundColor);
    c.gridy++;
    for (Category category : Category.allCategories) {
      JLabel label = makeLabel(category.getTitle(), category.isComputed() ? sumColor : numColor);
      add(label, c);
      c.gridy++;
    }
    JLabel label = makeLabel("Grand total", totalColor);
    label.setFont(new Font(label.getFont().getFontName(), Font.BOLD, (int)(label.getFont().getSize() * 1.5)));
    add(label, c);
    c.gridx++;

    // Add each player column
    int playerIndex = 0;
    playerLabels = new JLabel[game.getPlayers().size()];
    totalLabels = new JLabel[game.getPlayers().size()];
    for (Player player : game.getPlayers()) {
      Map<Category, JLabel[]> categoryMap = new LinkedHashMap<Category, JLabel[]>();
      labelMap.put(player, categoryMap);
      c.gridx = playerIndex * 3 + 1;
      c.gridy = 0;
      c.gridwidth = 3;
      c.anchor = GridBagConstraints.CENTER;
      playerLabels[playerIndex] = label = makeLabel(player.getName(), headerColor);
      label.setFont(new Font(label.getFont().getFontName(), Font.BOLD, (int)(label.getFont().getSize() * 1.5)));
      label.setHorizontalAlignment(JLabel.CENTER);
      add(label, c);

      c.gridwidth = 1;
      for (int columnIndex = 0; columnIndex < 3; columnIndex++) {
        c.gridx = playerIndex * 3 + 1 + columnIndex;
        c.gridy = 1;
        for (Category category : Category.allCategories) {
          ScoreLabel scoreLabel = new ScoreLabel(wham, game, player, columnIndex, category, category.isComputed() ? sumColor : numColor);
          // Make sure numbers are right-aligned
          scoreLabel.setHorizontalAlignment(JLabel.RIGHT);
          setLabelSize(scoreLabel, "99999");
          add(scoreLabel, c);
          JLabel[] columnLabels = columnIndex == 0 ? new JLabel[3] : categoryMap.get(category);
          if (columnIndex == 0) {
            categoryMap.put(category, columnLabels);
          }
          columnLabels[columnIndex] = scoreLabel;
          c.gridy++;
        }
      }
      // Grand total spans all 3 columns.
      c.gridx = playerIndex * 3 + 1;
      c.gridwidth = 3;
      ScoreLabel scoreLabel = new ScoreLabel(wham, game, player, 0, null, totalColor);
      scoreLabel.setFont(new Font(label.getFont().getFontName(), Font.BOLD, (int)(label.getFont().getSize() * 1.5)));
      scoreLabel.setHorizontalAlignment(JLabel.CENTER);
      add(scoreLabel, c);
      totalLabels[playerIndex] = scoreLabel;
      c.gridwidth = 1;
      playerIndex++;
    }
  }