2017-02-22 11 views
0

У меня есть java swing JList и вы хотите иметь возможность использовать ДВОЙНЫЕ клавиши для перехода к определенной строке в списке. Посмотрите на мой список ниже. Если я нажму клавишу 2 фокус в списке переходит на линию 2002. Но я хочу, чтобы иметь возможность нажать клавишу 22 (два 2: s) и фокус переходит к 2201.Ярлык в java swing JList

Мой список:

1001 
1002 
1003 
1101 
1102 
1103 
2002 
2003 
2004 
2201 
2202 

Кто-нибудь знает, возможно ли это для JList?

+1

Пожалуйста, прочтите и создайте и MCVE! http://stackoverflow.com/help/how-to-ask & http://stackoverflow.com/help/mcve. – StackFlowed

ответ

4

Это контролируется LAF.

В логике по умолчанию указано, что при вводе того же ключа список будет просто переходить к следующему элементу в списке.

Таким образом, вы не можете перейти непосредственно к номерам «22 ...», поскольку они пройдут через каждый элемент, начинающийся с «2 ...».

Однако, если у вас есть номер типа «2301» и «2311», вы сможете перейти непосредственно к этим номерам.

Здесь логика находится в классе BasicListUI:

public void keyTyped(KeyEvent e) { 
    JList src = (JList)e.getSource(); 
    ListModel model = src.getModel(); 

    if (model.getSize() == 0 || e.isAltDown() || 
      BasicGraphicsUtils.isMenuShortcutKeyDown(e) || 
      isNavigationKey(e)) { 
     // Nothing to select 
     return; 
    } 
    boolean startingFromSelection = true; 

    char c = e.getKeyChar(); 

    long time = e.getWhen(); 
    int startIndex = adjustIndex(src.getLeadSelectionIndex(), list); 
    if (time - lastTime < timeFactor) { 
     typedString += c; 
     if((prefix.length() == 1) && (c == prefix.charAt(0))) { 
      // Subsequent same key presses move the keyboard focus to the next 
      // object that starts with the same letter. 
      startIndex++; 
     } else { 
      prefix = typedString; 
     } 
    } else { 
     startIndex++; 
     typedString = "" + c; 
     prefix = typedString; 
    } 
    lastTime = time; 

    if (startIndex < 0 || startIndex >= model.getSize()) { 
     startingFromSelection = false; 
     startIndex = 0; 
    } 
    int index = src.getNextMatch(prefix, startIndex, 
           Position.Bias.Forward); 
    if (index >= 0) { 
     src.setSelectedIndex(index); 
     src.ensureIndexIsVisible(index); 
    } else if (startingFromSelection) { // wrap 
     index = src.getNextMatch(prefix, 0, 
           Position.Bias.Forward); 
     if (index >= 0) { 
      src.setSelectedIndex(index); 
      src.ensureIndexIsVisible(index); 
     } 
    } 
} 

Обратите внимание на комментарий, где устанавливается переменная «префикс».

Итак, если вы хотите изменить поведение, которое вам нужно создать, пользовательский интерфейс и переопределить метод. Не знаю, использует ли метод приватные переменные или методы.

Или другим вариантом было бы удалить KeyListener по умолчанию из JList. Затем вы можете реализовать свой собственный KeyListener и вызвать getNextMatch(...) непосредственно с вашим пользовательским определенным префиксом.

+0

Спасибо. У меня есть это объявление моего JList: частный JList officeList = новый JList(); В методе init() я затем удаляю по умолчанию KeyListener, так же, как вы предлагали: officeList.removeKeyListener (officeList.getKeyListeners() [0]); Но тогда я застрял. Как я могу реализовать собственный KeyListener? – chichi

+0

@chichi, я дал вам текущий код. Вам необходимо изменить его и добавить в свой собственный слушатель. Если вы не знаете, как писать KeyListener, тогда прочитайте раздел из учебника Swing по [Как написать KeyListener] (http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html) для базового примера, чтобы вы начали. – camickr

+0

Спасибо, я ценю это! – chichi

Смежные вопросы