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

ええと、リンクリストはリストであり、そのアイテムはインデックスでアクセスできます。これはインデックスでアイテムにアクセスするのに最適な構造ではありませんが、その種類のコレクションにカーソルを置くことができるかどうかはわかりませんが、現在のインデックスをインスタンス変数に格納できます。

本当にランダムアクセスが必要な場合は、リンクリストの代わりに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);
    }
}

個人的には、LinkedListよりもArrayListの方がパフォーマンスが高いと思います。

于 2012-04-24T02:04:40.087 に答える
4

インターフェイスへのコード:List<Instrument>。この関連するはをナビゲートしList<ImageIcon>ますが、実装は必要に応じて変更できます。

于 2012-04-24T02:06:39.573 に答える
4

MIDI楽器..次と前のボタン

配列を使用します(例Instrument[])。ユーザーが楽器を選択できるように、、、JComboBoxまたはJListで表示される場合があります。JSpinnerこれは、レンダラーとのコンボを使用した例です。

ここに画像の説明を入力してください

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 に答える