주목할 점은 요소가 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++;
}
}
}
이 답변은 "어떻게 수정합니까?" 질문, 나는 왜 그것이 일어나는 지 이해하고 싶습니다. 사용자가 내 목록에서 값을 선택하면 값 이상을 선택하고 선택한 항목이 상호 작용합니다. 기본 모델과 다른 클래스 사이에 어색한 상호 작용을하기보다는 SelectionModel에 모두 캡슐화하고 싶습니다. 나는 단지 기본값을 감쌀 수 있다고 생각한다. – Dogmatixed
나는 이것이 많은 구성 요소에 대한 정상적인 동작이라고 생각한다. 강조 표시된 텍스트가있는 Word 문서를 편집하는 방법을 생각해보십시오. 중간에 텍스트를 삽입하면 동일한 강조 표시가 상속됩니다. 강조 표시하는 방법은 시작/끝 범위를 유지하므로 중간에 추가하면 범위가 증가합니다. 같은 방식으로 작동하는 행 선택에 대한 기본 동작을 갖는 것과 어떤 차이점도 없습니다. – camickr
선택 모델에서 코드를 캡슐화하는 것이 바람직한 접근 방법입니다. 나는 이것이 얼마나 쉬운지/어려울 지 확신하지 못한다. – camickr