2013-08-07 3 views
0

У меня есть небольшое приложение Java swingui, где я показываю JList, и пользователь может вырезать, копировать, вставлять и сортировать список.Java Swing - Динамическое изменение JList с использованием TransferHandler

Я использую пользовательский TransferHandler, чтобы разрешить перетаскивание в этом Jlist. Вот код в построении JList, он в основном строит его из ArrayList. «lstScripts» - это JList.

ListTransferHandler lh = new ListTransferHandler(); 
... 
    DefaultListModel listModelScripts = new DefaultListModel(); 
    for(Script s : scripts) { 
     listModelScripts.addElement(s.getName()); 
    } 
    this.lstScripts = new JList(listModelScripts); 
    this.lstScripts.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    this.lstScripts.addListSelectionListener(this); 
    JScrollPane sp = new JScrollPane(this.lstScripts); 
    sp.setPreferredSize(new Dimension(400,100)); 
    this.lstScripts.setDragEnabled(true); 
    this.lstScripts.setTransferHandler(lh); 
    this.lstScripts.setDropMode(DropMode.ON_OR_INSERT); 
    setMappings(this.lstScripts); 
... 

На моем пользовательском классе TransferHandler, я получил рутинную работу ImportData так, что она обрабатывает копировать/вставить/вырезать/сорт.

public boolean importData(TransferHandler.TransferSupport info) { 
    String scriptname = null; // The script name on the list 

    //If we can't handle the import, bail now. 
    if (!canImport(info)) { 
     return false; 
    } 

    JList list = (JList)info.getComponent(); 
    DefaultListModel model = (DefaultListModel)list.getModel(); 
    //Fetch the scriptname -- bail if this fails 
    try { 
     scriptname = (String)info.getTransferable().getTransferData(DataFlavor.stringFlavor); 
    } catch (UnsupportedFlavorException ufe) { 
     System.out.println("importData: unsupported data flavor"); 
     return false; 
    } catch (IOException ioe) { 
     System.out.println("importData: I/O exception"); 
     return false; 
    } 

    if (info.isDrop()) { //This is a drop 
     JList.DropLocation dl = (JList.DropLocation)info.getDropLocation(); 
     int index = dl.getIndex(); 
     model.add(index, scriptname); 
     return true; 
    } else { //This is a paste 
     int index = list.getSelectedIndex(); 
     // if there is a valid selection, 
     // insert scriptname after the selection 
     if (index >= 0) { 
      model.add(list.getSelectedIndex()+1, scriptname); 
     // else append to the end of the list 
     } else { 
      model.addElement(scriptname); 
     } 
     return true; 
    } 
} 

Таким образом, до настоящего момента все работает отлично до графического интерфейса пользователя. Но моя проблема в том, что мне нужно, чтобы исходный JList «lstScripts» автоматически обновлялся с изменениями пользовательского интерфейса. Например, если пользователь сокращает или переупорядочивает список, я хочу, чтобы он отображался в «lstScripts».

Я не вижу, как установить эту связь между TransferHandler и оригинальным GUI-контроллером, где находится «lstScripts».

+0

У вас есть доступ к 'ListModel'? Если вам действительно нужно, вы также можете передать контроллер в «ListTransferHandler» ... – MadProgrammer

+0

не связаны: [не использовать setXXSize, когда-либо] (http://stackoverflow.com/a/7229519/203657) – kleopatra

+1

Я не знаю Не поймите вопрос: вы модифицируете модель, поэтому обновления просто происходят - или у вас есть два списка? – kleopatra

ответ

1

@ kleopatra - вы мне помогли! извините, я не понимал, как работает модель.

Итак, в контроллере я создаю JList «lstScripts» и добавляю его на свою панель (это первый блок моего кода выше).

pnlScripts.add(lstScripts, BorderLayout.WEST); 

И как выше мой код показал, то listScripts JList имел собственный набор TransferHandler как таковой:

this.lstScripts.setTransferHandler(lh); 

Так TransferHandler делает все DND пользователя (перетаскивание) вещи. В контроллере я могу получить обновленный список, выполнив следующие действия:

DefaultListModel model = (DefaultListModel)lstScripts.getModel(); 
for (int i = 0; i < model.getSize(); i++){ 
    scriptnames += model.getElementAt(i).toString() + ","; 
} 

Сценарий String теперь содержит обновленный список.

Спасибо!