2016-04-19 70 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; 
     } 
    } 
}