@Override
    public void update(IObservable ui) {
        if (!tablecards.initDone()) {
            tablecards.init(ui.getUIData().getPlayers().length);
        }
        if (scores.notInitialized()) {
            scores.initTable(ui.getUIData());
        }

        // shortcut
        UIDataInterface d = ui.getUIData();

        spinner.setModel(new SpinnerNumberModel(0, 0, ui.getUIData().getStats().getCurrentRoundNo(), 1));
        buildLog(d.getLog());

        handcards.setCards(ui.getCardsOnHand());

        tablecards.updateTable(d);
        scores.updateTable(d);

        // disable ui
        disableAllGameElements();
        switch (ui.getUIData().getState()) {
        case BETTING:
            lblStatus.setText(String.format(Language.getTrans("gui-betting", "It is %s's turn to predict now!"), d.getActivePlayer().getName()));
            spinner.setEnabled(true);
            btnForecast.setEnabled(true);
            break;
        case PLAYING:
            lblStatus.setText(String.format(Language.getTrans("gui-playing", "It is %s's turn to play now!"), d.getActivePlayer().getName()));
            handcards.setButtonsEnabled(true);
            break;
        case FINISHED:
            StringBuilder sb = new StringBuilder();
            sb.append("The game is over. Winner:\n");
            for (PlayerInterface p : d.getStats().getWinningPlayers()) {
                sb.append(String.format("  %s\n", p.getName()));
            }
            JOptionPane.showMessageDialog(frm, sb.toString(), "Finished Game!", JOptionPane.INFORMATION_MESSAGE);
            break;
        }
        if (!ui.getUIData().getActivePlayer().getName().equals(pfactory.getPlayername())) {
            disableAllGameElements();
            LOG.debug("keeping controls disabled, not your turn...");
        } else {
            lblStatus.setBackground(Color.GREEN);
        }
        this.frm.repaint();
    }