2015-01-01 7 views
0

Я не мог придумать лучшего названия для названия, мне жаль, если это не так декларативно. Я пытаюсь создать меню (для моей серверной программы), которое добавляет текстовое поле с ip каждый раз, когда клиент подключается к нему, и удаляет текстовое поле клиента, когда клиент отключается.AS3 - Меню с текстовыми полями

Когда никто не подключен: when nobody has connected

Когда люди связала: when people have connected

Большая проблема в том, что я хочу, чтобы все другие IP-адресов, ниже того, который отсоединен, чтобы двигаться вверх. Как я могу сделать это в AS3?

+0

Вы хотите удалить текстовый файл удалённого IP-адреса? Если вы знаете ip, связанный с текстовым полем, вам нужно просто удалить это текстовое поле, когда клиент отключится. – akmozo

+0

Да, но скажем, что номер 499 отключается (см. Второе изображение), когда я удаляю это текстовое поле, все под ним будут оставаться в том же положении, чего я не хочу. Я хочу, чтобы все текстовые поля были ниже тех, которые я удалил, чтобы переместиться вверх, чтобы заполнить пробел. –

+0

Я положил ответ, взгляните. – akmozo

ответ

1

После удаления вашего TextField, вы можете повторно позиции все другие текстовые поля, как это:

// the menu items container 
var menu:MovieClip = new MovieClip() 
    addChild(menu); 

for(var i=0; i<5; i++){ 
    var txt:TextField = new TextField(); 
     txt.x = 20; 
     txt.y = 26*i + 20; 
     txt.height = 24; 
     txt.width = 120; 
     txt.text = 'client : ' + i.toString(); 
     txt.border = true; 
     txt.addEventListener(
      MouseEvent.CLICK, 
      function(e:MouseEvent):void {    
       var parent:DisplayObjectContainer = e.target.parent; // which is the "menu" movieclip here 
       e.target.parent.removeChild(e.target); 
       set_objects(parent);   
      } 
     ) 
    menu.addChild(txt) 
} 

function set_objects(container:DisplayObjectContainer){ 

    var j:int = 0; 
    for(var i:int = 0; i < container.numChildren; i++){ 
     var child:DisplayObject = container.getChildAt(i); 

     // if the child is a TextFiled, set its new position 
     if(child is TextField){   
      child.y = 26*j + 20; 
      j++; 
     }  
    } 
} 

Конечно, этот код джут, чтобы показать способ, как сделать то, что вы хотите, вы должны улучшить и адаптировать его к вашим потребностям. Вы можете использовать этот код here.

Надеюсь, все, что может вам помочь.

1

Если вы не хотите переместить их все, просто сохраните список своих TextFields, а затем, когда вы получите разрыв, найдите индекс и переместите все последующие. Что-то вроде:

private var m_textFields:Vector.<TextField> = new Vector.<TextField>(); // all our textfields 
private var m_ipToTextField:Object   = new Object;    // an object to make it easier to find our textfield 

public function addIP(ip:String):void 
{ 
    var tf:TextField = this._createTextField(ip);   // create, style, and add your textfield 
    tf.y    = tf.height * this.m_textFields.height; // assuming they're all the same height 

    // add it to our storage objects 
    this.m_textFields.push(tf); 
    this.m_ipToTextField[ip] = tf; 
} 

public function removeIP(ip:String):void 
{ 
    // get our textfield and remove it 
    var tf:TextField = this.m_ipToTextFields[ip]; 
    tf.parent.removeChild(tf); 

    // get our index of the textfield in the vector 
    var index:int = this.m_textFields.indexOf(tf); 

    // move all subsequent textfields up by the height of the textfield that we removed 
    var len:int  = this.m_textFields.length; 
    var h:Number = tf.height; 
    for(var i:int = index + 1; i < len; i++) 
     this.m_textFields[i].y -= h; 

    // remove the textfield from our storage objects 
    this.m_textFields.splice(index, 1); 
    this.m_ipToTextField[ip] = null; 
    delete this.m_ipToTextField[ip]; 
}