2015-01-01 2 views
0

질문의 짧은 버전 : 스크롤되는 항목이 많은 JScrollPane이 있습니다. 특정 시간에 JScrollPane에 항목을 추가하고 목록 끝에 표시하지 말고 (예를 들어) 17 번째 항목을 표시합니다.JscrollPane의 특정 위치에 항목을 동적으로 스크롤하기

일반적으로 문제의 코드가 JScrollPane 파생 클래스 내에있는 경우 this.add(); 그러나 나는 이것이 목록의 끝으로 간다라고 생각한다.

사례 : 사례 1 : 스크롤하는 기본 데이터는 정렬 된 항목 목록이지만 추가는 목록의 어느 지점에서나 허용됩니다. 목록의 중간에 항목을 추가 할 때 JScrollPane에 전체 목록을 다시로드하지 않으려합니다.

사례 2 : 확장 하위 카테고리가있는 스크롤 목록을 시뮬레이션 중입니다. 따라서 사용자가 하위 범주를 확장하는 항목을 선택하면 내 Action 코드가이 사례를 인식하고 프로그램 데이터를 검색하여 하위 범주를 찾은 다음 선택한 범주 아래의 JScrollPane에 추가합니다. 걱정하지 마라. 액션 코드가 제공하는 하위 범주라는 시각적 표시가있을 것이다.

이 모든 것을 코딩 할 수 있습니다. 내가 배워야 할 것은 JScrollPane에 목록의 끝에 추가하지 않고 무언가를 추가하는 것입니다.

+0

1- 'JScrollPane # add'; 2 - 대답은이 "구성 요소"가 무엇인지에 달려 있습니다. – MadProgrammer

답변

1

답변은 항목을 추가하는이 구성 요소에 따라 다릅니다. JList을 사용하는 경우 DefaultListModel#add(int, Object)과 같은 것을 사용하여 특정 위치에 항목을 추가 할 수 있습니다.

당신이, 당신이 구성 요소를 추가해야하는 위치를 지정 JComponent#add(Component, int)를 사용할 수있는 JComponent (JPanel 유사한)를 기반으로 뭔가를 사용하는 경우, 이것은 즉, 당신이 구성 요소를 추가 할 수 없습니다 (위치가 있다고 가정 컨테이너가 단일 구성 요소 만 포함하는 경우 100을 배치).

다음 예제에서는 임의의 숫자를 생성하고 순서가 지정된 목록을 유지 관리하기 위해 숫자를 삽입해야하는 위치를 결정한 다음 그 위치에 구성 요소를 삽입합니다. 또한 JScrollPane을 스크롤하여 항목을 볼 수있게합니다.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JViewport; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test10 { 

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

    public Test10() { 
     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); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JPanel numbers; 
     private List<Integer> values; 

     public TestPane() { 
      values = new ArrayList<>(25); 
      setLayout(new BorderLayout()); 
      numbers = new JPanel(new GridLayout(0, 1)); 
      add(new JScrollPane(numbers)); 

      Timer timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int next = (int) (Math.random() * Integer.MAX_VALUE); 
        int insertion = Collections.binarySearch(values, next); 
        if (insertion < 0) { 
         insertion = (Math.abs(insertion)) - 1; 
        } 
        values.add(insertion, next); 
        JLabel label = new JLabel(Integer.toString(next)); 
        numbers.add(label, insertion); 
        numbers.revalidate(); 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          Point p = label.getLocation(); 
          JViewport vp = (JViewport) numbers.getParent(); 
          JScrollPane sp = (JScrollPane) vp.getParent(); 
          vp.setViewPosition(p); 
         } 
        }); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

} 
+0

고마워요. 이것은 훌륭하지만 의견과 추가 요청이 있습니다. 이것은 나에게 첫 번째 시나리오에 대한 답을 준다. (나는 add 메소드의 선택적 위치 매개 변수에 대해 몰랐다.)하지만 두 번째 시나리오는 생각만큼 쉽지 않다. –

+0

내 이전 의견이 잘 렸습니다. 두 번째 시나리오를 해결하기 위해 JList의 멤버 인 객체는 자체적으로 JList에 다른 멤버를 추가하려고합니다. 아이 오브젝트는 JList에있는 '인덱스'가 무엇인지 알아 내고 원하는 오브젝트와 색인을 가진 JList의 add 함수를 호출하고 색인 바로 뒤에 색인을 호출해야합니다. 자식 객체는 어떻게 색인을 찾습니까? –

+0

[DefaultListModel] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html)을 사용하는 경우 indexOf 메서드를 사용할 수 있습니다 – MadProgrammer

관련 문제