2011-07-31 1 views
1

주목할 점은 요소가 JList에 추가되고 요소가 선택된 값의 범위 내에있는 경우 해당 요소가 선택되는 것입니다 기본적으로. 사실 요소가 선택된 값 바로 위에 추가되면 선택 영역에 요소가 추가됩니다.두 개의 선택된 값 사이에있는 경우 사용자 정의 ListModel에 삽입 된 요소가 자동으로 선택됩니다.

(열린 JDK6에서) JList 코드와 BasicListUI 코드를 살펴 보았습니다. 그러나 왜 이런 일이 발생했는지 또는 해결해야 할 필요성에 대해 자세히 알지 못했습니다.

사용자 정의 SelectionModel을 제공하는 것이 좋습니다. 응용 프로그램에서 다른 작업을 수행 할 수있는 합리적인 장소가 될 수 있지만, 문제가 악화되거나 수정하기가 더 어려울 수도 있습니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 내가 그것을 고칠 수 있습니까?

나는 문제를 보여줍니다이 예를 만들었습니다 이것은 문제가되지 않습니다하지만 난 코드가 EDT에서 실행 얻을 수 있도록 당신이 집행자 대신 스윙 타이머를 사용한다고 생각

package jlistsscce; 

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 

public class JListSSCCE extends JPanel 
{ 
    private final JList list; 
    private ScheduledExecutorService ses; 

    public JListSSCCE() 
    { 
     list = new JList(); 
     list.setModel(new DefaultListModel()); 
     ses = Executors.newSingleThreadScheduledExecutor(); 
     ses.scheduleAtFixedRate(new NewElement(), 100, 100, TimeUnit.MILLISECONDS); 
     add(list); 
    } 

    private static void createGui() 
    { 
     // create new JFrame 
     JFrame jf = new JFrame("JListSSCCE"); 

     // this allows program to exit 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // You add things to the contentPane in a JFrame 
     jf.getContentPane().add(new JListSSCCE()); 

     // size frame 
     jf.pack(); 

     // make frame visible 
     jf.setVisible(true); 

    } 

    public static void main(String[] args) 
    { 
     // threadsafe way to create a Swing GUI 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() 
       { 
        createGui(); 
       } 
      } 
     ); 
    } 

    private class NewElement implements Runnable 
    { 
     int n = 0; 
     @Override 
     public void run() 
     { 
      ((DefaultListModel)list.getModel()).add((int)Math.floor(Math.sqrt(n)), ("hey"+n)); 
      n++; 
     } 

    } 
} 

답변

2

을 .

예 문제는 선택 모델입니다. 마지막으로 코드를 보았을 때 혼란 스럽다는 것을 알았으므로이 코드를 가지고 놀고 싶지는 않습니다.

제가 생각할 수있는 유일한 것은 다중 선택 간격을 사용하고 있는지 확인하는 것입니다. 그런 다음 요소를 삽입 한 후 요소가 선택되었는지 확인합니다. 그런 다음 해당 요소에 대한 선택을 제거합니다.

+0

이 답변은 "어떻게 수정합니까?" 질문, 나는 왜 그것이 일어나는 지 이해하고 싶습니다. 사용자가 내 목록에서 값을 선택하면 값 이상을 선택하고 선택한 항목이 상호 작용합니다. 기본 모델과 다른 클래스 사이에 어색한 상호 작용을하기보다는 SelectionModel에 모두 캡슐화하고 싶습니다. 나는 단지 기본값을 감쌀 수 있다고 생각한다. – Dogmatixed

+1

나는 이것이 많은 구성 요소에 대한 정상적인 동작이라고 생각한다. 강조 표시된 텍스트가있는 Word 문서를 편집하는 방법을 생각해보십시오. 중간에 텍스트를 삽입하면 동일한 강조 표시가 상속됩니다. 강조 표시하는 방법은 시작/끝 범위를 유지하므로 중간에 추가하면 범위가 증가합니다. 같은 방식으로 작동하는 행 선택에 대한 기본 동작을 갖는 것과 어떤 차이점도 없습니다. – camickr

+0

선택 모델에서 코드를 캡슐화하는 것이 바람직한 접근 방법입니다. 나는 이것이 얼마나 쉬운지/어려울 지 확신하지 못한다. – camickr