1

少し問題が発生しました。
私の GUI では、中央にテキスト領域があります ( BorderLayout)。それから私はJList西にいます。

リストにある曲のタイトルのメンバーをクリックすると、テキスト領域に曲のタイトル、アーティスト、および価格が表示されます。すべて動作していますが、問題は、メンバーをクリックすると、タイトル、アーティスト、および価格が 2 回表示されることです。

「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;
}

いままたプログラムをいじっていて気づいたことがあります。リスト内のメンバーを押すと、以前と同じように 2 回印刷されます。ただし、マウスを押したままにすると一度印刷され、離すと再度印刷されることに気付きました。そのため、1 つのメンバーでマウスを押し、カーソルを他のメンバーに上下にドラッグすると、それらは 1 回印刷されますが、マウスを離すと、終了したものがもう一度印刷されます。

4

1 に答える 1

3

JTextArea.append()から2回呼び出されていますListSelectionListener

その理由は、リストの使用方法にあります。

多くのリスト選択イベントは、マウスクリックなどの単一のユーザーアクションから生成できます。getValueIsAdjustingメソッドは、ユーザーがまだ選択を操作している場合にtrueを返します。この特定のプログラムは、ユーザーのアクションの最終結果にのみ関心があるため、valueChangedメソッドは、getValueIsAdjustingがfalseを返した場合にのみ何かを実行します。

の選択が操作されていないことを確認する必要がありますJListappendメソッドをチェックで囲むことができます。

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