2017-12-23 3 views
0

왜 모든 것이 두 번 인쇄되고 있는지 잘 모르겠습니다. 예를 들어 "남성"을 누르면 프로그램에서 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

당신이 모든 변화를위한이'valueChanged' 이벤트를 받고 있는가에 대한 How to Write a List Selection Listener의 읽기를 할 수 있습니까? –

+1

1) 더 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (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'의 각 선택 항목에 대한 두 개의 이벤트와 반대 됨). –

답변

0

당신이 목록에서 항목을 클릭 할 때 두 가지 이벤트마다 생성이 있습니다 : 첫 번째가 생성 될 때 눌러 마우스 버튼, 그리고 두 번째는 버튼을 해제 .

해결책은이다 (이것은 하나 개의 항목에있는 버튼을 누른 다음 다른 항목에 마우스를 드래그 범위 선택, 드래그 앤 드롭, 또는 사건의보다 정교한 패턴을 주로 관련) 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이 두 이벤트는 현재 선택 항목/범위의 "선택 해제"에 대한 하나 하나를 생성합니다 말하기 새 항목/범위의 "선택". 더 와서 이벤트 및 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); 
      } 
     }); 
    } 

} 

당신은 자세한 내용

+0

잠시 동안 나는 첫 번째 사건이 "선택 취소"로 인한 것일 수도 있다고 생각 했었지만 실제로는 그렇지 않습니다. (어쩌면 당신 (그리고 나는 ;-))이'JCheckBox'와'ChangeListener'가 "deselection 이벤트"를 일으키고, 보통 사람들은 선택을 위해서만'ActionListener'를 원합니다. 다만, getValueIsAdjusting의 일반적인 해결 방법은 같습니다. – Marco13

+0

@ Marco13 키보드로 두 번 이벤트를 수행하고 프로그래밍 방식으로 선택을 변경하는 것을 본 적이 있습니다. 작동하도록 만들 수 있다고 생각합니다. 처음 테스트했을 때 마우스를 눌렀다 놓은 상태에서 별도의 이벤트를 생성 할 수 없었지만 다음에 실행했을 때 - 혼란스러워졌습니다 – MadProgrammer

+1

이제 세부 사항을 살펴 보겠습니다. 이 세부 사항을 자세히 조사 할 경우 : JList와 같은 "복잡한"구성 ​​요소에서 이러한 이벤트의 동작을 제어 할 수 있으므로 LookAndFeel에 의존 할 수도 있다고 생각했습니다.그러나 getValueIsAdjusting을 사용하면 안전한쪽에 있어야합니다. – Marco13