JTextArea append()方法写两次?

时间:2013-01-21 18:06:02

标签: java swing jlist jtextarea

我遇到了一个小问题 在我的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个成员上,并将光标向上/向下拖动到其他成员,它们会打印一次,但是当我松开鼠标时,它会打印出我再次结束的那个。

1 个答案:

答案 0 :(得分:3)

JTextArea.append()从您的ListSelectionListener被调用两次。

原因可以在 How to Use Lists 中找到:

  

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

您需要检查JList中的选择是否不再受到操纵。您可以使用支票围绕append方法:

if (!e.getValueIsAdjusting()) {
   textArea.append(...);
}