2 JList instanzen wo nur einer zur selben Zeit selektierbar?

  • Themenstarter Themenstarter Bastien
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
B

Bastien

Gast
Hallo,

ich habe 2 JList instanzen wo links und rechts etwas ausgewählt werden kann:


das Problem ist es soll zur selben Zeit immer nur in einer JList etwas ausgewählt werden können. Das funktioniert auch zu 90 %... Das Problem ist wenn in einer JList etwas angeklickt wurde und ich in die andere JList klicke siehts aus wie auf dem Bild: wie man sieht ist das Element in der linken Liste unschön selektiert sprich es ist nur der Focus Rahmen aber keine echte Selektion wo das komplette Rechteck eine blaue Hintergrundfarbe bekommt.

aq32u8nb1w8w3tlqr.jpg


Den code könnt ihr einfach in eine leere Klasse einfügen und starten und sofort seht ich das fenster wie auf meinem screenshot.


der Code dazu:

Code:
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Test extends JFrame implements ListSelectionListener
{
        static final long serialVersionUID = 1L;   
        private DefaultListModel listModelLehrer = new DefaultListModel();
        private JList listeLehrer = new JList(listModelLehrer);
        private JScrollPane listbereichLehrer = new JScrollPane(listeLehrer);       
        private DefaultListModel listModelSchueler = new DefaultListModel();
        private JList listeSchueler = new JList(listModelSchueler);
        private JScrollPane listbereichSchueler = new JScrollPane(listeSchueler);

    public Test()
    {                     
        setLayout(null);   
        add(listbereichLehrer);
            add(listbereichSchueler);
            listbereichLehrer.setBounds(230,150,150,360);
            listbereichSchueler.setBounds(400,150,150,360);
            listModelSchueler.addElement("Verena Müller");
            listModelSchueler.addElement("Verena Müller");
            listModelSchueler.addElement("Verena Müller");
            
            listModelLehrer.addElement("Bruno Beisser"); 
            listModelLehrer.addElement("Bruno Beisser"); 
            listModelLehrer.addElement("Bruno Beisser"); 
            listModelLehrer.addElement("Bruno Beisser");   
        listeLehrer.addListSelectionListener(this);
        listeSchueler.addListSelectionListener(this);
    }
   
    public void valueChanged( ListSelectionEvent e )
    {           
           
            if(!e.getValueIsAdjusting())
        {                 
               
           if(e.getSource().equals(listeSchueler))
           {
                   listeLehrer.clearSelection();
        	       
                   
           }
           if(e.getSource().equals(listeLehrer))
           {                           
                  
        	   listeSchueler.clearSelection();
                  
           }                   
               
        }           
    }
   
    public static void main(String args[])
    {     
       Test Fenster = new Test();
       Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       Fenster.setSize(580,600);
       Fenster.setLocationRelativeTo(null);
       Fenster.setResizable(false);       
       Fenster.setVisible(true);   
    }
}
 
Das clearSelection() von JList wird an das ListSelectionModel weitergeleitet, was im Normalfall, wie auch bei dir, das DefaultListSelectionModel ist. Nach ein paar "Umleitungen" wird in der Methode DefaultListSelectionModel#changeSelection(int clearMin, int clearMax, int setMin, int setMax, boolean clearFirst) ein valueChangedEvent ausgelöst, was dich wiederum die clearSelection - Methode deiner anderen Liste aufrufen lässt. So enstehen insgesamt beim Wechsel von einer zur anderen Liste 3 Event.
Mfg André
 
Code:
if(e.getSource().equals(listeSchueler)) 
{ 
   clearSelection(listeLehrer);
}
if(e.getSource().equals(listeLehrer)) 
{                            
   clearSelection(listeSchueler);
}


private void clearSelection(JList list)
{
   list.removeListSelectionListener(this);    
   list.clearSelection(); 
   list.addListSelectionListener(this);   
}
 
And hat gesagt.:
Das clearSelection() von JList wird an das ListSelectionModel weitergeleitet, was im Normalfall, wie auch bei dir, das DefaultListSelectionModel ist. Nach ein paar "Umleitungen" wird in der Methode DefaultListSelectionModel#changeSelection(int clearMin, int clearMax, int setMin, int setMax, boolean clearFirst) ein valueChangedEvent ausgelöst, was dich wiederum die clearSelection - Methode deiner anderen Liste aufrufen lässt. So enstehen insgesamt beim Wechsel von einer zur anderen Liste 3 Event.
Mfg André

öhm ja :lol: Nur wie hilft mir das jetzt weiter?
 
Anonymous hat gesagt.:
And hat gesagt.:
Das clearSelection() von JList wird an das ListSelectionModel weitergeleitet, was im Normalfall, wie auch bei dir, das DefaultListSelectionModel ist. Nach ein paar "Umleitungen" wird in der Methode DefaultListSelectionModel#changeSelection(int clearMin, int clearMax, int setMin, int setMax, boolean clearFirst) ein valueChangedEvent ausgelöst, was dich wiederum die clearSelection - Methode deiner anderen Liste aufrufen lässt. So enstehen insgesamt beim Wechsel von einer zur anderen Liste 3 Event.
Mfg André

öhm ja :lol: Nur wie hilft mir das jetzt weiter?
Du weisst woher der Fehler kommt 😀
Und der Gast über dir hat dir sogar ne konkrete Lösung gegeben.
Mfg André
 
ouch beide um 17.58 Uhr geantwortet... da hat sich was überschnitten ;-)
 
And hat gesagt.:
...Und der Gast über dir hat dir sogar ne konkrete Lösung gegeben.
Das hat er wahrscheinlich noch nicht gesehen.


Noch eine Alternative
Code:
private boolean selecting = false;

    public void valueChanged( ListSelectionEvent e ) 
    {            
            
            if(!selecting && !e.getValueIsAdjusting() ) 
        {
           selecting = true;                  
                
           if(e.getSource().equals(listeSchueler)) 
           { 
                   listeLehrer.clearSelection(); 
                   
                    
           } 
           if(e.getSource().equals(listeLehrer)) 
           {                            
                  
              listeSchueler.clearSelection(); 
                  
           }                    

           selecting = false;
        }            
    }
 
Habs selber raus, danke euch 🙂

Code:
public void valueChanged( ListSelectionEvent e )
    {           
           
            if(!e.getValueIsAdjusting())
        {                 
               
           if(e.getSource().equals(listeSchueler))
           {
        	   clearSelection(listeLehrer);
           }
           if(e.getSource().equals(listeLehrer))
           {                           
                 
        	   clearSelection(listeSchueler);
                 
           }                
        }        
    }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben