这可能是一个愚蠢的问题,但我很难想到这一点。
我写了一个方法,它使用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 :(得分: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[]
)。它可能会显示在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;
}
}