2016-04-19 17 views
0

Die JList unterstützt Mehrfachauswahl, wenn Sie die Strg-Taste gedrückt halten: Drücken Sie Strg + Auf/Ab, um einige unsichtbare Marker (Nimbus LAF) zu bewegen. Wenn Sie kein Leerzeichen drücken, wird das Element ausgewählt.JList rendern unsichtbar "Auswahlmarker"

Beispiel: Ihre JList hat drei Elemente, von denen das erste ausgewählt ist. Sie wissen, drücken Sie Strg + Down, Strg + Down und dann Leertaste. Das letzte Element ist jetzt ausgewählt.

Die Frage ist: Wie kann ich den unsichtbaren Marker rendern, den ich mit Strg + auf/ab bewegen?

Zum Beispiel rendert der Windows-Datei-Explorer diesen Marker mit einem gepunkteten Rahmen und ich mag es, etwas ähnliches zu rendern. Die Sache ist, dass Sie mit Strg + Auf/Ab die Auswahl nicht ändern, aber Sie ändern das Element, das ausgewählt/abgewählt werden würde, wenn Sie die Leertaste drücken.

Antwort

2

DefaultListCellRenderer tun es automatisch mit speziellen Rahmen. Wenn Sie diesen Rahmen ändern möchten, können Sie die entsprechende Einstellung von L & F in UIManager ändern.

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Component; 

import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.border.StrokeBorder; 

public class ListTryout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       UIManager.put("List.focusCellHighlightBorder", BorderFactory.createDashedBorder(Color.GRAY)); 
       final JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.add(new JScrollPane(new JList<String>(new String[] {"one", "two", "three"}))); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

Wenn Sie etwas anderes machen möchten, können Sie Ihren eigenen Renderer schreiben.

import java.awt.Color; 
import java.awt.Component; 

import javax.swing.DefaultListCellRenderer; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class ListTryout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
//    UIManager.put("List.focusCellHighlightBorder", new StrokeBorder(new BasicStroke(2f))); 
       final JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       JList<String> l = new JList<String>(new String[] {"one", "two", "three"}); 
       l.setCellRenderer(new MyRenderer()); 
       f.add(new JScrollPane(l)); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 

    private static class MyRenderer extends DefaultListCellRenderer { 
     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (!isSelected && cellHasFocus) { // custom highlight of focused but not-selected cell 
       result.setBackground(Color.LIGHT_GRAY); 
       ((JComponent) result).setBorder(null); 
      } 
      return result; 
     } 
    } 
}