2012-11-28 2 views
1

사용자가 스크롤 할 때 JScrollPane에서 이벤트를 처리해야합니다. here에는 을 JViewport 또는 Vertical/HorizontalScrollBar 중 하나에 사용하는 것이 좋습니다.JScrollPane adjustmentListener 및 scrollRectToVisible

어떤 차이가 있습니까? 어떤 방법을 선택해야합니까?

또한이 JScrollPanescrollRectToVisible을 사용하고 싶습니다.이 방법으로 AdjustmentListener을 사용해야합니까?

또한 scrollRectToVisible이 필요한 직사각형으로 표시되도록 최소 스크롤을 시도하는지 또는 JViewport 중간에 표시하려고하는지 궁금합니다.

UPD : 요구 사항 :

1) 많은 JLabel의 (이미지 아이콘을 가지고 하나 인 JPanel)와 JScrollPane의, 그래서 그들 중 일부는 볼 수가 없습니다.

2) 네트워크 이벤트가 발생하면 사용자에게 JLabel (표시 가능) 중 하나를 표시해야합니다. 원래 표시되어 있지 않으면 JScrollPane이 자동으로 스크롤됩니다. 그것이 내가 scrollRectToVisible을 언급 한 이유입니다.

3) 위의 ImageIcon이있는 JLabel에서이 요소에 어떤 현상이 발생했는지 설명하는 메시지를 표시해야합니다. 이 메시지는 현재 계층 구조가 훨씬 높은 JLayeredPane 덕분에 수레가있는 다른 JLabel로 구현됩니다. 문제는, JLabel가 대응하는 JLabel (ImageIcon)의 최상부에있을 필요가있는 것에 따라, JLabel가 움직여야한다고 JScrollPane를 스크롤했을 경우입니다.

UDP2 : 아직 JLabel의 부동 구현하지 않은,하지만 이미 내가 scrollRectToVisible에 인덱스 (11 개) 반응하여 레이블이가 반립니다 때문에 얼마나 마음에 들지

SSCCE. 대답의

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class JScrollPaneTest { 
    protected ArrayList<JLabel> labels = new ArrayList<JLabel>(); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JScrollPaneTest(); 
      } 
     }); 
    } 

    public JScrollPaneTest() { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 

       JPanel panel1 = new JPanel(); 

       panel1.setLayout(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 

       for (int i = 0; i < 20; i++) { 
        JLabel label = new JLabel(" | Label" + i + " | "); 
        panel1.add(label, gbc); 
        labels.add(label); 
       } 

       panel1.addMouseListener(new MouseAdapter(){ 
        public void mousePressed (MouseEvent me) { 
         JLabel label = labels.get(11); 
         label.scrollRectToVisible(label.getBounds()); 
        } 
       }); 

       JScrollPane pane = new JScrollPane(panel1) { 
        private static final long serialVersionUID = 1L; 

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

       pane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
        @Override 
        public void adjustmentValueChanged(AdjustmentEvent e) { 
         System.out.println("adjustmentValueChanged: " + e); 
        } 
       }); 

       frame.getContentPane().add(pane); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

JComponent의이 JScrollPane의에 배치하면 스크롤 구현했습니다 달려 될 수 – mKorbel

+1

당신이 정말로 요구 사항에 생각하기 시작한다 (예상 솔루션 대비) : 무엇을 달성하고 싶습니까? – kleopatra

+0

@kleopatra 요구 사항을 추가했습니다. –

답변

4

부분 (주석 코드는 ... 그리고 내가 코멘트 ;-)

로 scrollRectToVisible 구성 요소의 좌표 시스템으로 사각형을 소요하는 방법에 잘못이 있었다 발견이 에 요청됩니다. 이 두 가지 옵션이 기본적으로 완전히 볼 수 있도록 아이를 스크롤하려면 (그 중 하나 사용) :

// either call on child with zero offset 
child.scrollRectToVisible(new Rectangle(child.getSize()); 
// or call on child's parent with child bounds 
child.getParent().scrollRectToVisible(child.getBounds()); 
+0

와우, 정말 scrollRectToVisible()을 자식과 부모에게 두 번 호출해야합니까? –

+0

@NikolayKuznetsov - 아니, 어느 쪽이든, 다른 사람이 선호도를 선택하고 명확히하려고했습니다. – kleopatra

+0

예, 작동합니다. 그렇지만 현재는 가장자리에 있습니다. JScrollPane의 중심에 그것을 어떻게 표시 할 수 있습니까? –