2013-05-04 3 views
0

Я пытаюсь создать скроллер для рук, который будет прокручиваться при перетаскивании мышью через JPanel. Пока я не могу изменить мнение. Вот мой код:Java Swing Scrolling, перетаскивая мышь

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 


public class HandScroller extends JFrame { 

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

    public HandScroller() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 


     final JPanel background = new JPanel(); 
     background.add(new JLabel("Hand")); 
     background.add(new JLabel("Scroller")); 
     background.add(new JLabel("Test")); 
     background.add(new JLabel("Click")); 
     background.add(new JLabel("To")); 
     background.add(new JLabel("Scroll")); 

     final JScrollPane scrollPane = new JScrollPane(background); 

     MouseAdapter mouseAdapter = new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       JViewport viewPort = scrollPane.getViewport(); 
       Point vpp = viewPort.getViewPosition(); 
       vpp.translate(10, 10); 
       background.scrollRectToVisible(new Rectangle(vpp, viewPort.getSize())); 
      } 
     }; 

     scrollPane.getViewport().addMouseListener(mouseAdapter); 
     scrollPane.getViewport().addMouseMotionListener(mouseAdapter); 

     setContentPane(scrollPane); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

} 

Я думаю, что это сдвинет вид на 10 в направлениях х и у, но ничего не делает вообще. Есть ли что-то еще, что я должен делать?

Спасибо.

ответ

2

Ваш код действительно работает. Проще говоря, нет ничего, чтобы прокрутить, так как окно достаточно велико (на самом деле, pack() вызвала JFrame для изменения размера to fit the preferred size and layouts of its subcomponents)

Удалить pack(); и заменить эту линию, скажем, setSize(60,100);, чтобы увидеть эффект.

+0

Или вызовите 'setPreferredSize (...);' как предложено в другом ответе: это зависит от того, что логически «сокращается» в вашем приложении, либо в окне, либо в одном компоненте пользовательского интерфейса. –

1

Работает. Однако, когда вы запускаете этот код, JScrollPane сделан достаточно большим, чтобы соответствовать всем вашим предметам. Добавить (например)

scrollPane.setPreferredSize(new Dimension(50, 50)); 

и вы увидите, что ваши события мыши работают нормально.

+0

Спасибо, это работает правильно, когда я установить предпочтительный размер. –

2

Я думаю, так что вы можете переместить вид во всех направлениях с этим кодом

public void mouseDragged(MouseEvent e) { 

      JViewport viewPort = scroll.getViewport(); 
      Point vpp = viewPort.getViewPosition(); 
      vpp.translate(mouseStartX-e.getX(), mouseStartY-e.getY()); 
      scrollRectToVisible(new Rectangle(vpp, viewPort.getSize())); 

} 

public void mousePressed(MouseEvent e) { 

    mouseStartX = e.getX(); 
    mouseStartY = e.getY(); 

} 
+0

Я получил это для работы, добавив две последние строки в функцию 'mouseDragged'. Он отлично работает! Благодаря! – SatA

+0

Я добавил объявления mouseStartX/Y, а также код для сброса этих значений в конце mouseDragged(), так что движения мыши не умножаются от положения первого щелчка мыши. –

Смежные вопросы