public void initialize(int xSize, int ySize) {
    _root = getContentPane();
    _root.removeAll();

    int height = getHeight();
    // int width = getWidth();

    Insets inset = new Insets(0, 0, 0, 0);
    int bySize = height / (ySize + 1);
    int bxSize = bySize; // getWidth() / xSize;

    int pan_sx = 150; // (width-bxSize*8)/2;

    JPanel toRoot = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));

    JPanel[] Sides = new JPanel[2];
    for (int i = 0; i < Sides.length; i++) {
      Sides[i] = new JPanel(new BorderLayout(0, 0));
      Sides[i].setMinimumSize(new Dimension(pan_sx, 0));
      Sides[i].setPreferredSize(new Dimension(150, 150));
      Sides[0].setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    }

    _buttons = new PositionableButton[xSize][ySize];
    JPanel board = new JPanel(new GridLayout(XSize, YSize, 0, 0));
    for (int i = 0; i < _buttons.length; i++) {
      for (int j = 0; j < _buttons[i].length; j++) {
        _buttons[i][j] = new PositionableButton();
        _buttons[i][j].addActionListener(new ButtonClickedListener());
        _buttons[i][j].setPosition(new Position(j, i));
        _buttons[i][j].setVisible(true);
        _buttons[i][j].setPreferredSize(new Dimension(bxSize, bySize));
        _buttons[i][j].setMargin(inset);
        board.add(_buttons[i][j]);
      }
    }

    if (_thread == null) {
      _thread = new RedrawThread(_buttons);
      _thread.start();
    }

    _slimg = new StateableLabel(StateableLabel.Type.Image);
    _slimg.setPreferredSize(new Dimension(100, 100));
    _slimg.setSize(new Dimension(100, 100));
    _slimg.setMaximumSize(new Dimension(100, 100));
    _slimg.setMinimumSize(new Dimension(100, 100));
    _slnam = new StateableLabel(StateableLabel.Type.Name);
    _sltxt = new StateableLabel();

    Sides[0].add(_slimg, BorderLayout.NORTH);
    Sides[0].add(_slnam, BorderLayout.CENTER);
    Sides[0].add(_sltxt, BorderLayout.SOUTH);

    toRoot.add(Sides[0], BorderLayout.WEST);
    toRoot.add(board, BorderLayout.CENTER);
    toRoot.add(Sides[1], BorderLayout.EAST);

    _root.add(toRoot);
  }
 public void changeCharacter() {
   _slimg.setCharacter(Retentioner_Character.getCharacter());
   _slnam.setCharacter(Retentioner_Character.getCharacter());
   _sltxt.setCharacter(Retentioner_Character.getCharacter());
   _slimg.changeState(Retentioner_Character.getState());
   _slnam.changeState(Retentioner_Character.getState());
   _sltxt.changeState(Retentioner_Character.getState());
 }
 @Override
 public void onCharacterChanged() {
   CharacterState state = Retentioner_Character.getState();
   _slimg.changeState(state);
   _sltxt.changeState(state);
 }