2017-12-23 7 views
0

なぜすべてが2回印刷されているのかわかりません。たとえば、 "Male"を押すと、プログラムはMaleMaleを出力します。これはもっと大きなプログラムの一部です:ジェンダー(String)に最後の選択を保存します。このコードはこれを実行していますか?二重印刷JList

DefaultListModel toAdd = new DefaultListModel(); 
toAdd.addElement("Male"); 
toAdd.addElement("Female"); 
toAdd.addElement("Others"); 

JList list = new JList(); 
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
list.setBorder(new TitledBorder(null, "How do you identify yourself?", ` 
TitledBorder.CENTER, TitledBorder.TOP, null, null)); 
list.setBackground(SystemColor.info); 
list.setBounds(57, 85, 244, 97); 
list.setModel(toAdd); 
frame.getContentPane().add(list); 

list.addListSelectionListener(new ListSelectionListener() { 

     public void valueChanged (ListSelectionEvent event) { 
      int lastSelIx = list.getMaxSelectionIndex(); 
      gender = (String) list.getModel().getElementAt(lastSelIx); 
      System.out.print(gender); 
     }  
    ); 
} 
+1

ためHow to Write a List Selection Listenerの読み取りを持つことができますか? –

+1

1)すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 2)Java GUIは、異なるロケールで異なるPLAFを使用する異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 3) ''どのようにあなた自身を特定するのですか? ''性別に関して... –

+2

..これは' ButtonGroup'にラジオボタン( 'JRadioButton')として表現されることが多いです。 'ActonListener'を各ボタンに追加して、各選択に対して単一のアクションイベントを取得します(' JList'の各選択に対して2つのイベントとは対照的に)。 –

答えて

0

は、リスト内の項目をクリックしたときに、2つのイベントが毎回生成があります。最初のものが作成されるとき、あなたプレスマウスボタン、2つ目あなたがボタンを離し

(これは、範囲選択、ドラッグアンドドロップのより洗練されたパターンのために主に関連して、または使用すると、1つの項目のボタンを押し、その後、別の項目にマウスをドラッグする場合)

溶液がですListSelectionListenerの「選択値がまだ調整中かどうか」を確認します。したがって、イベントリスナーの方法では、

if (event.getValueIsAdjusting()) return; 

のような操作を行うことができます。 MCVEとしてここ

、一緒にいくつかの他のクリーンアップと:

import java.awt.SystemColor; 

import javax.swing.BorderFactory; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class JListSelectionDoubleEvent 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() 
    { 
     DefaultListModel<String> listModel = new DefaultListModel<String>(); 
     listModel.addElement("Male"); 
     listModel.addElement("Female"); 
     listModel.addElement("Others"); 

     JList<String> list = new JList<String>(listModel); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     list.setBorder(
      BorderFactory.createTitledBorder("How do you identify yourself?")); 
     list.setBackground(SystemColor.info); 

     list.addListSelectionListener(new ListSelectionListener() 
     { 
      @Override 
      public void valueChanged(ListSelectionEvent event) 
      { 
       if (event.getValueIsAdjusting()) 
       { 
        //System.out.println("Adjusting. Ignore this"); 
        return; 
       } 
       String gender = list.getSelectedValue(); 
       System.out.print(gender); 
      } 
     }); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(list); 
     frame.setSize(400, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
1

は一般的に言えば、ListSelectionListenerは、2つのイベント、現在選択されている項目/範囲とするための1つの「選択解除」のいずれかを生成します新しい項目/範囲の「選択」。

あなたが選択となっているものにだけ興味があるなら、あなたはこれ以上の関連イベントが来ていません(または選択が安定した)場合、より来るイベントやfalseがある場合trueを返します。これは、ListSelectionEvent#getValueIsAdjustingを使用することができ、例えば...

import java.awt.EventQueue; 
import java.awt.SystemColor; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.TitledBorder; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class JavaApplication20 { 

    public static void main(String[] args) { 
     new JavaApplication20(); 
    } 

    public JavaApplication20() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       DefaultListModel toAdd = new DefaultListModel(); 
       toAdd.addElement("Male"); 
       toAdd.addElement("Female"); 
       toAdd.addElement("Others"); 

       JList list = new JList(); 
       list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
       list.setBorder(new TitledBorder(null, "How do you identify yourself?", TitledBorder.CENTER, TitledBorder.TOP, null, null)); 
       list.setBackground(SystemColor.info); 
       list.setModel(toAdd); 
       frame.getContentPane().add(new JScrollPane(list)); 

       list.addListSelectionListener(new ListSelectionListener() { 

        public void valueChanged(ListSelectionEvent event) { 
         if (!event.getValueIsAdjusting()) { 
          int lastSelIx = list.getMaxSelectionIndex(); 
          String gender = (String) list.getModel().getElementAt(lastSelIx); 
          System.out.println(gender); 
         } else { 
          // You can ignore this, I was just testing ;) 
          int lastSelIx = event.getFirstIndex(); 
          String gender = (String) list.getModel().getElementAt(lastSelIx); 
          System.out.println(gender); 
         } 
        } 
       }); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

はあなたがすべての変更のための2つの `valueChanged`イベントを取得している詳細

+0

しばらくの間、私は最初の出来事が「選択解除」によって引き起こされるかもしれないとも考えましたが、これは事実ではありません。 (おそらくあなた(そして私;;-))はこれを 'JCheckBox'と混同します。ここで' ChangeListener'は "選択解除イベント"を引き起こし、通常は選択のための 'ActionListener'が必要です)。しかし、 'getValueIsAdjusting'の一般的な解決策は同じです。 – Marco13

+0

@ Marco13私はそれがキーボードとプログラムによる選択変更のために二重のイベントを行うのを見てきたと確信しています。これを初めてテストしたとき、マウスを押して離したときに別々のイベントを生成することはできませんでしたが、次回はそれを実行したので、混乱してしまいました – MadProgrammer

+1

これは詳細になりました。これらの詳細をさらに調べようとすると、LookAndFeelに依存する可能性もあると考えました。これは、JListのような複雑なコンポーネントでこのようなイベントの動作を制御する可能性があるためです。しかし、 'getValueIsAdjusting'では、安全面にあるべきです。 – Marco13

関連する問題