3

这可能是一个愚蠢的问题,但我很难考虑清楚。

我编写了一个使用 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();
}

提前谢谢各位!

4

4 回答 4

4

ListIterator#next()方法返回感兴趣的对象。如果它是我的项目,我将从该方法返回的内容分配给类字段,然后通知 GUI 更改。

someInstrument = itr.next();
// fire notify observers method.
于 2012-04-24T02:02:46.410 回答
4

MIDI 乐器 .. 下一个和上一个按钮

使用数组(例如Instrument[])。它可能显示在 a JComboBox、 aJList或 aJSpinner中,以允许用户选择仪器。这是一个使用带有渲染器的组合的示例。

在此处输入图像描述

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;
    }
}
于 2012-04-24T02:32:45.887 回答
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 会更高效

于 2012-04-24T02:04:40.087 回答
4

接口代码:List<Instrument>. 此相关示例导航 a List<ImageIcon>,但可以根据需要更改实现。

于 2012-04-24T02:06:39.573 回答