public void propertyChange(PropertyChangeEvent e) {
    Object subject = e.getSource();

    try {
      if (subject == viewPx) {
        float f = Float.parseFloat(viewPx.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.finger_tip.x = f;
          moveIfAble();
        }
      }
      if (subject == viewPy) {
        float f = Float.parseFloat(viewPy.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.finger_tip.y = f;
          moveIfAble();
        }
      }
      if (subject == viewPz) {
        float f = Float.parseFloat(viewPz.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.finger_tip.z = f;
          moveIfAble();
        }
      }

      if (subject == viewRx) {
        float f = Float.parseFloat(viewRx.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.iku = f;
          moveIfAble();
        }
      }
      if (subject == viewRy) {
        float f = Float.parseFloat(viewRy.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.ikv = f;
          moveIfAble();
        }
      }
      if (subject == viewRz) {
        float f = Float.parseFloat(viewRz.getField().getText());
        if (!Float.isNaN(f)) {
          this.motion_future.ikw = f;
          moveIfAble();
        }
      }
    } catch (NumberFormatException e2) {
    }
  }
  @Override
  public ArrayList<JPanel> getControlPanels() {
    ArrayList<JPanel> list = super.getControlPanels();

    if (list == null) list = new ArrayList<JPanel>();

    CollapsiblePanel rspPanel = new CollapsiblePanel("Inverse Kinematics");
    rspPanel.getContentPane().setLayout(new GridLayout(0, 1));

    view_home = new JButton("Home");
    viewPx = new JLabelledTextField(Float.toString(motion_now.finger_tip.x), "X");
    viewPy = new JLabelledTextField(Float.toString(motion_now.finger_tip.y), "Y");
    viewPz = new JLabelledTextField(Float.toString(motion_now.finger_tip.z), "Z");
    viewRx = new JLabelledTextField(Float.toString(motion_now.iku), "U");
    viewRy = new JLabelledTextField(Float.toString(motion_now.ikv), "V");
    viewRz = new JLabelledTextField(Float.toString(motion_now.ikw), "W");
    rspPanel.getContentPane().add(view_home);
    rspPanel.getContentPane().add(viewPx);
    rspPanel.getContentPane().add(viewPy);
    rspPanel.getContentPane().add(viewPz);
    rspPanel.getContentPane().add(viewRx);
    rspPanel.getContentPane().add(viewRy);
    rspPanel.getContentPane().add(viewRz);
    view_home.addActionListener(this);
    viewPx.addPropertyChangeListener("value", this);
    viewPy.addPropertyChangeListener("value", this);
    viewPz.addPropertyChangeListener("value", this);
    viewRx.addPropertyChangeListener("value", this);
    viewRy.addPropertyChangeListener("value", this);
    viewRz.addPropertyChangeListener("value", this);

    list.add(rspPanel);
    updateGUI();

    return list;
  }