1

我遇到了一个小问题。
在我的 GUI 中,我在中心有一个文本区域 ( BorderLayout)。然后我有一个JList关于西方的。

当我单击列表中的歌曲名称成员时,文本区域应显示歌曲的名称、艺术家和价格。我一切正常,但问题是当我点击一个成员时,标题、艺术家和价格会显示两次。

这是“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;
}

刚才在我再次摆弄我的程序时,我注意到了一些东西。当我按下列表中的成员时,它仍然像以前一样打印两次。但是,我注意到当我按住鼠标时它会打印一次,当我放开它时它会再次打印。因此,如果我在 1 个成员上按下鼠标,并将光标向上/向下拖动到其他成员,它们会打印一次,但是当我放开鼠标时,它会再打印一次我结束的那个。

4

1 回答 1

3

JTextArea.append()正在从您的ListSelectionListener.

原因可以在如何使用列表中找到:

许多列表选择事件可以从单个用户操作(例如鼠标单击)生成。如果用户仍在操作选择,则 getValueIsAdjusting 方法返回 true。这个特定的程序只对用户操作的最终结果感兴趣,因此 valueChanged 方法只有在 getValueIsAdjusting 返回 false 时才会执行某些操作。

您需要检查 中的选择JList是否不再被操纵。您可以用检查包围该append方法:

if (!e.getValueIsAdjusting()) {
   textArea.append(...);
}
于 2013-01-21T19:37:03.283 回答