2016-04-19 71 views
0

当您按住控制键时,JList支持多种选择:按Ctrl +向上/向下移动某个不可见标记(nimbus LAF)。如果你没有按空格,元素被选中。JList渲染不可见“选择标记”

示例:您的JList有三个元素,第一个元素被选中。你知道按Ctrl + Down,Ctrl + Down和Space。现在选择了最后一个元素。

现在的问题是:我如何渲染不可见的标记,我用Ctrl +向上/向下移动?

例如,Windows文件浏览器渲染带有虚线边框的标记,我喜欢渲染类似的东西。事情是,按Ctrl +向上/向下,你不改变选择,但你改变将被选择/取消选择,如果你按空格的元素。

回答

2

DefaultListCellRenderer使用特殊边框自动执行此操作。如果要更改此边框,可以在UIManager中更改L & F的适当设置。

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); 
      } 
     }); 
    } 
} 

如果你想做别的事情,你可以写你自己的渲染器。

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; 
     } 
    } 
}