private ActionListener createKickOutListener() {
        return new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                PeerStatus status = LocalInfo.getPeerStatus();
                if (!(status == PeerStatus.STARTER || status == PeerStatus.INVITEE)) {
                    JOptionPane.showMessageDialog(frame, "You have no authority to do that");
                    return;
                }
                Map<String, Peer> peers = LocalInfo.getPeers();
                Object[] possibleValues = new Object[peers.size()];
                int i = 0;
                for (String str : peers.keySet()) {
                    possibleValues[i++] = str;
                }
                Object selectedValue = JOptionPane.showInputDialog(null,
                        "Choose one", "Input",
                        JOptionPane.INFORMATION_MESSAGE, null,
                        possibleValues, null);
                if (selectedValue == null)
                    return;
                String target = (String) selectedValue;
                // kicked out and wait for their confirm
                LocalSender.sendKickoutRequestMsg(target);
                // present a dialog to user to show lock request sent and open a timer to wait for others
                WaitingDialog dialog = new WaitingDialog(frame, true, "Waiting for other peers' confirm..");
                if (VoteTool.isComplete()) {
                    JOptionPane.showMessageDialog(null, "Kickout Request Confirmed!");
                    LocalSender.sendKickoutCommandMsg(target.getBytes());
                } else {
                    JOptionPane.showMessageDialog(null, "Kickout Request Failed!");
                }
            }
        };
    }