2013-05-08 5 views
1

JScrollpane으로 둘러싸인 다른 이동 가능하고 크기가 조정 가능한 JPanel을 포함하는 JPanel 인 본질적으로 약속 달력을 만들었습니다.이 모든 것이 잘 작동하고 스크롤바를 사용하여 JPanel을 스크롤 할 수 있습니다. 바르게. 나는 나의 신청서를 끝내는 것에 가깝지만 한 가지 더 많은 것을 성취하고자한다.오브젝트를 끌 때 JScrollpane 자동 스크롤

사용자가 약속 (JPanel)을 움직이면 스크롤바 가장자리에 도달하면 자동으로 원하는 속도로 스크롤됩니다. 나는 기존의 방법이나 클래스가 이것을 할 수 있는지 혼란 스럽다. (존재하는 경우) 또는 누군가 내 필요에 맞는 jar 라이브러리를 알고 있다면 혼란 스럽다.

게으른가요? 예, 아마도 제가 직접 코딩해야한다고 생각합니다. 누군가 내가 시작할 곳을 제안 할 수 있다면 동의합니까? 나는 여전히 Java를 배우고 있으며, 코드를 깨끗하고 깔끔하게 유지하기 위해 부드러운 전환이 필요할 수도 있습니다.

답변을 더 자세히 제공 할 수 있다면 알려주십시오.

+0

감사 @GuillaumePolet, 나는 스크롤 및 패널 모두에이 추가 시도했다, 그러나 그것은 작동하지 않습니다. 내가 한 일은이 방법과 상충되는 것일 수도 있습니다. 나는 작업중인 코드를 추가 할 것이다. 그것을 다듬을 시간이 걸릴 것입니다, 그것은 거대합니다! –

답변

4

좋아, 실제로별로 복잡하지 않습니다. "스크롤 가능한"구성 요소에 setAutoscroll(true);으로 전화하고 scrollRectToVisible을 호출하는 MouseMotionListener을 추가해야합니다. 여기

작은 예제 코드입니다 :

import java.awt.BorderLayout; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class TestImageResize { 

    protected void initUI() throws MalformedURLException, IOException { 
     final JFrame frame = new JFrame(TestImageResize.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BufferedImage bi = ImageIO.read(new URL(
       "http://www.desktopwallpaperhd.net/wallpapers/19/5/islands-paradise-maldive-nature-background-image-landscape-194469.jpg")); 
     JPanel panel = new JPanel(new BorderLayout()); 
     JLabel label = new JLabel(new ImageIcon(bi)); 
     panel.add(label); 
     MouseMotionListener doScrollRectToVisible = new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1); 
       ((JPanel) e.getSource()).scrollRectToVisible(r); 
      } 
     }; 
     panel.addMouseMotionListener(doScrollRectToVisible); 

     panel.setAutoscrolls(true); 
     frame.add(new JScrollPane(panel)); 
     frame.pack(); 
     frame.setSize(frame.getWidth()/2, frame.getHeight()/2); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new TestImageResize().initUI(); 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

우수 사례가 내가 원하는 방식으로 작동합니다. 나는 그것을 내 코드에 적용하고 다시보고 할 것이다. 이것에 시간을내어 주셔서 감사합니다. –

+0

좋아요, 메인 패널을 드래그 할 때 작동하지만 맨 위에있는 다른 jpanel을 움직이면 작동하지 않습니다. –

+0

개별 약속에 리스너를 추가했지만 끌어 올 때 맨 위로 스크롤됩니다. 나는 아래에 추가 한 I가 변경 무엇을 : '모든 MouseMotionListener doScrollRectToVisible = 새로운 MouseMotionAdapter() { \t @Override \t 공공 무효의 mouseDragged (된 MouseEvent 전자) { \t \t 사각형 R = 새로운 Rectangle (mainPanel.getX(), mainPanel. getY(), 1, 1); \t \t mainPanel.scrollRectToVisible (r); \t} }; appPanel.addMouseMotionListener (doScrollRectToVisible); 'Eeeek! 주석에 어떻게 개행을 입력합니까? 죄송합니다! –