我遇到了一个小问题
在我的GUI中,我在中心有一个文本区域(BorderLayout
)。然后我在西方有一个JList
。
当我点击列表中的歌曲标题的成员时,文本区域应显示歌曲的标题,艺术家和价格。 我有一切正常,但问题是,当我点击一个成员时,标题,艺术家和价格显示为TWICE。
以下是“valueChanged()”的代码和相关的部分代码。
public void valueChanged(ListSelectionEvent e)
{
Object source = e.getSource();
int index = songList.getSelectedIndex();
Song selection = songCollection[index];
if(source == songList)
{
textArea.append(selection.getTitle() + " " + selection.getArtist() + " " + selection.getPrice() + "\n" );
}
}
private Song songCollection[] = new Song[5];
private String songTitle[] = new String[5];
//Fill song array
songCollection = getSongs();
songTitle = getSongTitle();
//Methods:
public Song[] getSongs()
{
Song[] array = new Song[5];
array[0] = new Song("Summer", "Mozart", 1.50);
array[1] = new Song("Winter", "Mozart", 1.25);
array[2] = new Song("Spring", "Mozart", 2.00);
array[3] = new Song("Baby", "Justin Bieber", 0.50);
array[4] = new Song("Firework", "Katy Perry", 1.00);
return array;
}
public String[] getSongTitle()
{
String[] names = new String[5];
for(int i = 0; i < 5; i++)
names[i] = songCollection[i].getTitle();
return names;
}
当我再次摆弄我的程序时,我注意到了一些事情。当我按下列表中的某个成员时,它仍然像以前一样打印TWICE。但是,我注意到当我按下并按下鼠标时它会打印一次,当我放开它时它会再次打印。因此,如果我将鼠标按在1个成员上,并将光标向上/向下拖动到其他成员,它们会打印一次,但是当我松开鼠标时,它会打印出我再次结束的那个。
答案 0 :(得分:3)
JTextArea.append()
从您的ListSelectionListener
被调用两次。
原因可以在 How to Use Lists 中找到:
可以从单个用户操作(例如鼠标单击)生成许多列表选择事件。如果用户仍在操作选择,则getValueIsAdjusting方法返回true。此特定程序仅对用户操作的最终结果感兴趣,因此valueChanged方法仅在getValueIsAdjusting返回false时才执行某些操作。
您需要检查JList
中的选择是否不再受到操纵。您可以使用支票围绕append
方法:
if (!e.getValueIsAdjusting()) {
textArea.append(...);
}