@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "IS2_INCONSISTENT_SYNC")
  // Ignore unsynchronized access to state
  public void initComponents() throws Exception {
    // SprogMessage msg;
    super.initComponents();

    // Add a nice border to super class
    super.jScrollPane1.setBorder(
        BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Command History"));

    // Let user press return to enter message
    entryField.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
            enterButtonActionPerformed(e);
          }
        });

    /*
     * Command panel
     */
    JPanel cmdPane1 = new JPanel();
    cmdPane1.setBorder(
        BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Send Command"));
    cmdPane1.setLayout(new FlowLayout());

    cmdLabel.setText("Command:");
    cmdLabel.setVisible(true);

    sendButton.setText("Send");
    sendButton.setVisible(true);
    sendButton.setToolTipText("Send packet");

    cmdTextField.setText("");
    cmdTextField.setToolTipText("Enter a SPROG command");
    cmdTextField.setMaximumSize(
        new Dimension(cmdTextField.getMaximumSize().width, cmdTextField.getPreferredSize().height));

    cmdTextField.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
            sendButtonActionPerformed(e);
          }
        });

    sendButton.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
            sendButtonActionPerformed(e);
          }
        });

    cmdPane1.add(cmdLabel);
    cmdPane1.add(cmdTextField);
    cmdPane1.add(sendButton);

    getContentPane().add(cmdPane1);

    /*
     * Address Panel
     */
    JPanel speedPanel = new JPanel();
    speedPanel.setBorder(
        BorderFactory.createTitledBorder(
            BorderFactory.createEtchedBorder(), "Speed Step Mode for SPROG Throttle"));
    speedPanel.add(speed14Button);
    speedPanel.add(speed28Button);
    speedPanel.add(speed128Button);
    speedGroup.add(speed14Button);
    speedGroup.add(speed28Button);
    speedGroup.add(speed128Button);
    speed14Button.setToolTipText("Set 14 speed steps for SPROG throttle");
    speed28Button.setToolTipText("Set 28 speed steps for SPROG throttle");
    speed128Button.setToolTipText("Set 128 speed steps for SPROG throttle");

    getContentPane().add(speedPanel);

    /*
     * Configuration panel
     */
    JPanel configPanel = new JPanel();
    configPanel.setBorder(
        BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Configuration"));
    configPanel.setLayout(new FlowLayout());

    // *** Which versions support current limit ???
    currentLabel.setText("Current Limit (mA):");
    currentLabel.setVisible(true);

    currentTextField.setText("");
    currentTextField.setEnabled(false);
    currentTextField.setToolTipText("Enter new current limit in milliAmps (less than 1000)");
    currentTextField.setMaximumSize(
        new Dimension(
            currentTextField.getMaximumSize().width, currentTextField.getPreferredSize().height));

    //        currentTextField.addActionListener(new java.awt.event.ActionListener() {
    //            public void actionPerformed(java.awt.event.ActionEvent e) {
    //                validateCurrent();
    //            }
    //        });
    ztcCheckBox.setText("Set ZTC mode");
    ztcCheckBox.setVisible(true);
    ztcCheckBox.setToolTipText("Use this when programming older ZTC decoders");

    blueCheckBox.setText("Set Blueline mode");
    blueCheckBox.setVisible(true);
    blueCheckBox.setEnabled(false);
    blueCheckBox.setToolTipText(
        "Use this when programming blueline decoders - programming will be slower");

    unlockCheckBox.setText("Unlock firmware");
    unlockCheckBox.setVisible(true);
    unlockCheckBox.setEnabled(false);
    unlockCheckBox.setToolTipText("Use this only if you are about to update the SPROG firmware");

    configPanel.add(currentLabel);
    configPanel.add(currentTextField);
    configPanel.add(ztcCheckBox);
    configPanel.add(blueCheckBox);
    configPanel.add(unlockCheckBox);

    getContentPane().add(configPanel);

    /*
     * Status Panel
     */
    JPanel statusPanel = new JPanel();
    statusPanel.setBorder(
        BorderFactory.createTitledBorder(
            BorderFactory.createEtchedBorder(), "Save/Load Configuration"));
    statusPanel.setLayout(new FlowLayout());

    saveButton.setText("Save");
    saveButton.setVisible(true);
    saveButton.setToolTipText("Save SPROG configuration (in the SPROG EEPROM)");

    saveButton.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
            saveButtonActionPerformed(e);
          }
        });

    statusPanel.add(saveButton);

    getContentPane().add(statusPanel);

    // pack for display
    pack();

    // Now the GUI is all setup we can get the SPROG version
    // Only send this if we have zero active slots in slot manager
    // in command mode
    if (sm.getInUseCount() == 0) {
      SprogVersionQuery.requestVersion(this);
    }
  }
 public void dispose() {
   _memo.getTrafficController().removeIEEE802154Listener(this);
   // unwind swing
   super.dispose();
 }
 public void dispose() {
   SprogTrafficController.instance().removeSprogListener(this);
   super.dispose();
 }