2013-05-08 2 views
1

Я создал календарь встреч, который по существу является JPanel, который содержит другие перемещаемые и изменяемые размеры JPanels, окруженные JScrollpane, все это хорошо работает, и я могу прокручивать вокруг JPanel с помощью полос прокрутки правильно. Я близок к завершению моего приложения, но хотел бы добиться еще одной вещи.Autoscroll a JScrollpane при перетаскивании объекта

Что бы я хотел сделать, когда пользователь перемещает встречу (JPanel), когда вы достигаете края прокрутки, она автоматически прокручивается с требуемой скоростью. Я смущен, какой существующий метод или класс может это сделать (если таковой имеется), или если кто-нибудь знает о библиотеке jar, доступной там, которая будет соответствовать моим потребностям?

Это ленивый? Да, наверное, наверное, я должен сам ее закодировать, если вы согласитесь, может кто-нибудь предложить, где я начну? Я все еще изучаю Java, и мне может понадобиться нежное толчок, чтобы мой код был чистым и аккуратным.

Если я могу предоставить более подробную информацию, чтобы помочь с ответом, дайте мне знать.

+0

благодаря @GuillaumePolet, я попытался добавить это как ScrollPane и панели, но он не работает. Вполне возможно, что что-то, что я сделал, противоречит этому методу. Я посмотрю на добавление кода, над которым я работаю. Это займет время, чтобы обрезать его, он массивный! –

ответ

4

Хорошо, это на самом деле не так уж сложно. Вам нужно позвонить setAutoscroll(true); на свой «прокручиваемый» компонент и добавить MouseMotionListener, который вызывает scrollRectToVisible.

Вот небольшой пример кода:

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

Я добавил слушателя к отдельным встречам, но когда я перетаскиваю его, прокручивается до самого верха. Я добавил в ниже того, что я изменил: 'MouseMotionListener doScrollRectToVisible = новый MouseMotionAdapter() { \t @Override \t общественного недействительными mouseDragged (MouseEvent е) { \t \t Прямоугольник г = новый прямоугольник (mainPanel.getX(), mainPanel. getY(), 1, 1); \t \t mainPanel.scrollRectToVisible (r); \t} }; appPanel.addMouseMotionListener (doScrollRectToVisible); 'Eeeek! Как вы вводите новую строку в комментариях? Сожалею! –