2012-04-24 77 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 2012-04-24 02:02:36

+0

我需要使用數據結構,並且我熟悉鏈表,但是我不知道Java有ArrayLists。 – FireStorm 2012-04-24 02:10:36

回答

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 2012-04-24 02:10:42

+1

+1使用列表的索引。迭代器方法的問題是,當你的UI打開時,你不能添加/刪除任何工具,或者你被搞砸了(不會是第一個碰到'ConcurrentModificationException'的人) – Robin 2012-04-24 05:40:48

4

ListIterator#next()方法返回感興趣的對象。如果是我的項目,我會將從該方法返回的內容分配給類字段,然後通知GUI該更改。

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

+1表示鬆耦合。 – trashgod 2012-04-24 02:09:02

+1

我只是爲此使用一個數組,並將其轉儲到一個組件中,該組件可以處理「儀器」更改的下一個/上一個,呈現和通知。看我的例子。 – 2012-04-24 02:35:06

4

代碼發送到界面更高性能:List<Instrument>。這個相關的example導航List<ImageIcon>,但實施可以根據需要進行更改。

+0

我只是用這個數組。看我的例子。 – 2012-04-24 02:33:32

+1

+1使用列表的索引。迭代器方法的問題在於,您的UI在打開時無法添加/刪除任何工具,或者您被搞砸了(爲了清晰起見,您不會第一個碰到'ConcurrentModificationException'的人) – Robin 2012-04-24 05:40:23

4

MIDI樂器..下一個和前一個按鈕

使用陣列(例如Instrument[])。它可以顯示在JComboBoxJListJSpinner中,以允許用戶選擇樂器。這裏是一個使用渲染器組合的例子。

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 2012-04-24 09:42:59

相關問題