2016-04-19 10 views
0

コントロールキーを押したときにJListが複数の選択をサポートします。Ctrl + Up/Downを押して、不可視マーカー(nimbus LAF)を移動します。スペースを押さないと、要素が選択されます。JListレンダリング不可視「選択マーカー」

例:JListには3つの要素があり、最初の要素が選択されています。 Ctrl + Down、Ctrl + Down、Spaceを押してください。最後の要素が選択されます。

質問:私はCtrl +上/下を使って移動する目に見えないマーカーをどのようにレンダリングできますか?

たとえば、Windowsファイルエクスプローラでは、このマーカーに点線の境界線が描画され、同様のレンダリングが必要です。 Ctrl + Up/Downを使用すると、選択範囲は変更されませんが、Spaceキーを押すと選択/選択解除される要素が変更されます。

答えて

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; 
     } 
    } 
} 
関連する問題