使用链接列表实现下一个和上一个按钮

时间:2012-04-24 01:59:53

标签: java swing linked-list jbutton actionlistener

这可能是一个愚蠢的问题,但我很难想到这一点。

我写了一个方法,它使用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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

嗯,链接列表是一个List,它的项目可以通过索引访问,这不是通过索引访问项目的最佳结构,但我真的不知道你是否可以在这种类型的集合,但您可以将当前索引存储在实例变量上。

如果您真的想要随机访问,那么您应该考虑使用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

会更高效

答案 2 :(得分:4)

界面代码:List<Instrument>。此相关example导航List<ImageIcon>,但可以根据需要更改实施。

答案 3 :(得分: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;
    }
}