2012-04-24 2 views
3

Это может быть глупый вопрос, но у меня возникли проблемы с этим.реализация следующих и предыдущих кнопок с помощью LinkedList

Я написал метод, который использует LinkedList для перемещения через загруженные MIDI-инструменты. Я хочу сделать следующую и предыдущую кнопку, чтобы каждый раз, когда вы нажимаете кнопку, вы проходите через LinkedList.

Если я жёстко itr.next(); или itr.previous(); несколько раз я могу пройти через LinkedList

public void setInsturment(Synthesizer start,MidiChannel currentChannel[]) 
{ 
    try 
    { 
     start.open(); 

     Soundbank bank = start.getDefaultSoundbank(); 

     start.loadAllInstruments(bank); 

     LinkedList<Instrument> currentInstrument = new LinkedList<Instrument>(); 

     Instrument instrs[] = start.getLoadedInstruments(); 

     currentInstrument.add(instrs[0]); 
     currentInstrument.add(instrs[1]); 
     currentInstrument.add(instrs[2]); 
     currentInstrument.add(instrs[3]); 
     currentInstrument.add(instrs[4]); 

     ListIterator itr = currentInstrument.listIterator(); 
     itr.next(); 
     itr.next(); 
     itr.next(); 
    // nextInstrument(); 

     currentChannel[1].programChange(0,itr.nextIndex()); 

    } 

    catch(MidiUnavailableException e) 
    { 
     System.out.print("error"); 
    } 

} 

У меня много неприятностей сделать кнопку, которая может перемещаться по списку. Есть ли эффективный способ сделать это? Я пробовал что-то подобное без успеха.

public void actionPerformed(ActionEvent e) 
{ 
    if (e.getSource() == nextButton) 
    { 
     sound.nextInstrument(); 
    } 

public void nextInstrument() 
{ 
    itr.next(); 
} 

Спасибо заранее, ребята!

+0

Почему связанный список? ArrayList и запоминание текущего индекса кажется более простым (особенно, поскольку у вас уже есть инструменты в массиве). – Thilo

+0

Мне нужно было использовать структуру данных, и я знаком со связанными списками, однако я не знал, что Java имеет ArrayLists. – FireStorm

ответ

4

Ну, гм, связанный список является списком и его элементы могут быть доступны по индексу, это не оптимальная структура для доступа к элементам по индексу, но я действительно не знаю, если вы можете иметь курсор на такой коллекции, но вы можете сохранить текущий индекс в переменной экземпляра.

Если вы действительно хотите получить произвольный доступ, вам следует рассмотреть возможность использования ArrayList вместо связанного списка.

Пример:

class NextPrevList { 
    private int index = 0; 
    private List currentList; //initialize it with some list 

    public Object next() { 
     return list.get(++index); 
    } 
    public Object prev() { 
     //maybe add a check for out of bounds 
     if (index == 0) return null; 
     return list.get(--index); 
    } 
} 

Лично я думаю, что было бы более производительным с ArrayList, а не LinkedList

+0

+1 для кодирования интерфейса 'List'. – trashgod

+1

+1 для использования индекса списка.Проблема с подходом итератора заключается в том, что вы не можете добавлять/удалять какие-либо инструменты, пока ваш пользовательский интерфейс открыт, или вы ввернуты (не будет первым человеком, который столкнется с «ConcurrentModificationException») – Robin

4

Метод ListIterator#next() возвращает объект, представляющий интерес. Если бы это был мой проект, я бы присвоил то, что возвращается из этого метода, в поле класса, а затем уведомит об этом графический интерфейс.

someInstrument = itr.next(); 
// fire notify observers method. 
+0

+1 для свободной связи. – trashgod

+1

Я бы просто использовал массив для этого и сбрасывал его в компонент, который может обрабатывать следующий/предыдущий, рендеринг и уведомление об изменении «Instrument». См. Мой пример. –

4

Код для интерфейса: List<Instrument>. Это связано с example навигацией List<ImageIcon>, но реализация может быть изменена по мере необходимости.

+0

Я бы просто использовал массив для этого , См. Мой пример. –

+1

+1 для использования указателя списка. Проблема с подходом итератора заключается в том, что вы не можете добавлять/удалять какие-либо инструменты, пока ваш пользовательский интерфейс открыт, или вы ввернуты (не будет первым человеком, который столкнется с «ConcurrentModificationException») – Robin

4

MIDI инструменты .. следующий и предыдущий кнопка

использовать массив (например Instrument[]). Он может отображаться в JComboBox, JList или JSpinner, чтобы позволить пользователю выбирать инструмент. Вот пример использования комбо с рендерером.

enter image description here

import java.awt.Component; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 
import javax.swing.*; 
import javax.sound.midi.*; 

class InstrumentSelector { 

    public static void main(String[] args) throws MidiUnavailableException { 
     Synthesizer synthesizer = MidiSystem.getSynthesizer(); 
     synthesizer.open(); 
     final Instrument[] orchestra = synthesizer.getAvailableInstruments(); 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JComboBox orchestraSelector = new JComboBox(orchestra); 
       orchestraSelector.setRenderer(new InstrumentRenderer()); 

       JOptionPane.showMessageDialog(null, orchestraSelector); 
      } 
     }); 
    } 
} 

class InstrumentRenderer extends BasicComboBoxRenderer { 

    @Override 
    public Component getListCellRendererComponent(
     JList list, 
     Object value, 
     int index, 
     boolean isSelected, 
     boolean cellHasFocus) { 
     Component c = super.getListCellRendererComponent(
      list, value, index, isSelected, cellHasFocus); 
     if (c instanceof JLabel && value instanceof Instrument) { 
      JLabel l = (JLabel)c; 
      Instrument i = (Instrument)value; 
      l.setText(i.getName()); 
     } 
     return c; 
    } 
} 
+0

+1 для ясности. – trashgod

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