public MemoryFrame(java.awt.Frame parent, final DCPU dcpu) {
        super(parent, false);
        initComponents();
        this.ramTable.setModel(new DCPUMemoryTableModel(dcpu));
        
        //disallow selection of column 0
        this.ramTable.getColumnModel().setSelectionModel(new DefaultListSelectionModel() {

            @Override
            public void setSelectionInterval(int index0, int index1) {
                if (index0 < 1 || index1 < 1) {
                    return;
                }
                super.setSelectionInterval(index0, index1);
            }

        });
        
        //update the cell information panel
        ListSelectionListener listSelectionListener = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
               int col = ramTable.convertColumnIndexToModel(ramTable.getSelectedColumn()) - 1;
               int row = ramTable.convertRowIndexToModel(ramTable.getSelectedRow());
               final Word position = new Word();
               position.setUnsignedInt(row * (ramTable.getModel().getColumnCount() - 1) + col);
               memoryCellInformationPanel1.setMemoryCell("0x" + position.toHexString(), dcpu.getRam(position));
            }
        };
        this.ramTable.getSelectionModel().addListSelectionListener(listSelectionListener);
        this.ramTable.getColumnModel().getSelectionModel().addListSelectionListener(listSelectionListener);
        
        //change selected and first cell design
        this.ramTable.setDefaultRenderer(Word.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
               int selectedCol = ramTable.convertColumnIndexToModel(ramTable.getSelectedColumn());
               int selectedRow = ramTable.convertRowIndexToModel(ramTable.getSelectedRow());
                if (isSelected || hasFocus || (selectedCol == column && selectedRow == row)) {
                    c.setBackground(new Color(107, 129, 137));
                    c.setForeground(new Color(255, 255, 255));
                } else {
                    if (column == 0) {
                        c.setBackground(SystemColor.control);
                        c.setForeground(SystemColor.controlText);
                    } else {
                        final Color basicColor = table.getBackground();
                        final Color rowColor = row % 2 == 0 ? basicColor : basicColor.brighter();
                        final Color colColor = column % 2 == 0 ? basicColor : SwingUtils.shiftHue(basicColor);
                        c.setBackground(SwingUtils.mix(rowColor, colColor));
                        c.setForeground(table.getForeground());
                    }
                }
                return c;
            }            
        });
        
        ramTable.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        ramTable.getSelectionModel().setSelectionInterval(0, 0);
        ramTable.getColumnModel().getSelectionModel().setSelectionInterval(1, 1);
    }