2012-05-08 2 views
2

У меня есть JPanel, который содержит два JLists - оба могут иметь выбранный в них элемент - как и ожидалось.Java Swing - сделать два JLists «братьями и сестрами» - т. Е. Можно выбрать только один элемент из одного

То, что я хотел бы быть в состоянии сделать, это так, что только один элемент в либо выбрать

Может кто-нибудь помочь мне с любым

а) «женитьбы» их так, это может в таком случае

b) дает мне несколько советов по наилучшей практике для записи слушателей, которые могут руководить ими и обезображивать все элементы одного, когда выбирается другой, - я бы предпочел избежать этого, если это возможно, насколько я могу см. это становится уродливым !!

Спасибо :)

+0

все еще не совсем понял _why_ вы хотите этого. Если только для «подсвечивания» причин, которые не показывают выбор в каком-либо состоянии, вы можете реализовать это в пользовательском рендерере. – kleopatra

ответ

3

Я думаю, что лучшее решение, а также для пользователей, ставит переключатель рядом с категорией меткой в ​​каждый список, так что вы явно отключить другие каждый раз, когда вы выбираете один.

Я могу представить себе пользователь, нажав значения в первом списке, а затем нажав на следующем и, видя все ценности, которые кликали ушел, с логическим расстройством ...

Затем, когда вы принимаете значения из форма, просто возьмите разрешенные

+0

спасибо - это полезно, но его для «выделения» на экране - и два JLists выделяют два источника, поэтому только один из них нужно выбирать одновременно - но я согласен, что это лучший подход вообще –

3

Слушатель не так уж и трудный, чтобы не писать. Я бы

  • убедитесь, что списки поддерживают только одиночный выбор
  • добавить тот же выбор слушателя модели выбора в обоих списках

Этот слушатель может быть реализован как

public void valueChanged(ListSelectionEvent e){ 
    if (e.isAdjusting()) return; 

    ListSelectionModel sourceSelectionModel = (ListSelectionModel) e.getSource(); 
    if (!sourceSelectionModel.isSelectionEmpty()){ 
    //still need to implement the findOtherSelectionModel method 
    ListSelectionModel other = findOtherSelectionModel(sourceSelectionModel); 
    other.clearSelection(); 
    } 
} 

Примечание что очистка выбора снова вызовет слушателя, но из-за проверки isSelectionEmpty вы не закончите цикл. Другим подходом было бы отключить слушателя (например, с флагом boolean) прямо перед тем, как вы вызовете clearSelection в другом списке.

+0

, вызывающий clearSelection() вызывает valueChanged снова, что приводит к исключению NullPointerException –

Смежные вопросы