Java Swing - сделать двух братьев и сестер JList - т.е. можно выбрать только один элемент в каждом из них

У меня есть JPanel, который содержит два JList - оба могут иметь выбранный элемент в них - как и ожидалось.

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

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

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

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

Спасибо :)


person Morris Fauntleroy    schedule 08.05.2012    source источник
comment
до сих пор не совсем понимаю, зачем вам это нужно. Если это только для выделения причин, то есть не отображения выбора при каком-либо условии, вы можете реализовать это в пользовательском средстве визуализации.   -  person kleopatra    schedule 02.08.2012


Ответы (2)


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

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

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

person Eugenio Cuevas    schedule 08.05.2012
comment
спасибо - это полезно, но это для выделения на экране - и два JList выделяют два источника, поэтому за раз нужно выбирать только один - но я согласен, что в целом это лучший подход - person Morris Fauntleroy; 08.05.2012

Слушателя не так сложно и некрасиво писать. я буду

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

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

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 в другом списке.

person Robin    schedule 08.05.2012
comment
вызов clearSelection() снова вызывает valueChanged, что приводит к исключению NullPointerException - person Morris Fauntleroy; 08.05.2012