JScrollPane über JScrollPane

Goldfish

Bekanntes Mitglied
Hi, nur ne kurze Frage zum scrollen innerhalb eines JScrollPanes.
Also ich habe ein einfaches ScrollPane Objekt und darin diverse weitere. Zwei von den inneren Objekten sind wieder JScrollPanes. Wenn ich nun auf dem äußeren ScrollPane scrolle funktioniert alles wunderbar. Nur wenn ich auf einem der inneren JScrollPanes bin, und dieser komplett durchgescrollt hat, möchte ich, dass dann das äußere ScrollPane reagiert und weiter scrollt. Wie kann ich das machen?

Danke schonmal im Voraus ^^
 
Ich müßte jetzt ausprobieren, wie das in Java/Swing ist, aber in anderen Zusammenhängen gibt es eine "Konvention" (?) : Man scrollt darin, wo man zuletzt die Maus bewegt hat. Wenn man z.B. hier ein Codefenster hat
Java:
// Code
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...

und oben anfängt, das Browserfenster zu scrollen, scrollt er über das Codefenster hinweg (OHNE das Codefenster zu scrollen), außer, wenn man die Maus im Codefenster bewegt hat. (Aber vielleicht ist das auch gar keine "Konvention", sondern nur ein Zufallsfeature vom Firefox in Windows...).

Ein Ansatz KÖNNTE! sein, erstmal einen ChangeListener an die inneren Viewports zu hängen - damit sollte man zumindest rausfinden, wann die zuende gescrollt sind. DANN das Scrollen an die "übergeordnete" Scrollpane "weiterzureichen" könnte aber ziemlich frickelig werden. Ich weiß zufällig, dass Swing bei MouseWheelEvents intern einige ... interessante/kreative... Sachen macht, um genau das vorleigende Verhalten zu erreichen - man müßte mal schauen, wo man sich da einhaken könnte.
 
Mein Ansatz: processMouseWheel deines ScrollPanes überschreiben, überprüfen ob der Scrollbar am min/maximum ist und dann der übergeordneten ScrollPane ein Event zuwerfen.
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.MouseWheelEvent;

import javax.swing.BoundedRangeModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;


public class ScrollInScroll extends JFrame
{
	
	private JPanel contentPane;
	private JScrollPane scrollPane;
	private JPanel panel;
	private JScrollPane scrollPane_1;
	private JPanel panel_1;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						ScrollInScroll frame = new ScrollInScroll();
						frame.setVisible(true);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
	
	/**
	 * Create the frame.
	 */
	public ScrollInScroll()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(400, 600));
		scrollPane.setViewportView(panel);
		
		scrollPane_1 = new JScrollPane()
		{
			@Override
			public void processMouseWheelEvent(MouseWheelEvent e)
			{
				super.processMouseWheelEvent(e);
				BoundedRangeModel model=getVerticalScrollBar().getModel();
				
				int val=model.getValue();
				int min=model.getMinimum();
				int max=model.getMaximum()-model.getExtent();
				int scroll=e.getWheelRotation();
				
				System.out.println(val+" "+min+" "+max+" "+scroll);
				
				if((val==min && scroll<0) ||(val==max && scroll>0))
				{
					System.out.println("Event sent");
					MouseWheelEvent e2=new MouseWheelEvent(scrollPane, e.getID(), e.getWhen(), e.getModifiers(), 0, 0, e.getClickCount(), e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(), e.getWheelRotation());					
					java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e2);
				}
			}
		};
		scrollPane_1.setPreferredSize(new Dimension(100, 100));
		panel.add(scrollPane_1);
		
		panel_1 = new JPanel();
		panel_1.setPreferredSize(new Dimension(300, 300));
		scrollPane_1.setViewportView(panel_1);
	}
	
}
 

Neue Themen


Zurück
Oben