2016-04-19 1 views
0

JList поддерживает несколько вариантов при удерживании клавиши управления: нажмите Ctrl + Вверх/Вниз, чтобы переместить невидимый маркер (nimbus LAF). Если у вас нет пространства для печати, элемент выбирается.JList визуализирует невидимый «маркер выбора»

Пример: ваш JList имеет три элемента, первый из которых выбран. Вы знаете, нажмите Ctrl + Вниз, Ctrl + Вниз, а затем Пробел. Теперь выбран последний элемент.

Вопрос: Как визуализировать невидимый маркер с помощью Ctrl + вверх/вниз?

Например, проводник файлов Windows делает этот маркер пунктирной рамкой, и мне нравится визуализировать нечто подобное. Дело в том, что с помощью Ctrl + Up/Down вы не меняете выделение, но вы меняете элемент, который будет выбран/отменен, если вы нажмете «Пробел».

ответ

2

DefaultListCellRenderer делать это автоматически используя специальный окантовка. Если вы хотите изменить эту границу, вы можете изменить соответствующую настройку L & F в UIManager.

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; 
     } 
    } 
} 
Смежные вопросы