Swing JScrollPane und Scroll-Geschwindigkeit

C

Camino

Gast
Hallo,

ich hab eine etwas umfangreichere Swing-Anwendung erstellt, bei der im Hauptframe ein MainPanel in den CENTER-Bereich hinzugefügt wird. Dieses MainPanel wiederum ist ein JTabbedPane und kann mehrere Tabs (JPanel) hinzufügen, welche wieder um CardLayout haben und zwischen mehreren (ziemlich umfangreichen) Formularen hin- und herschalten können. Das funktioniert auch soweit. Diese Formulare werden in eine JScrollPane gelegt und diese JScrollPane dann dem CardLayout hinzugefügt. Nun ist mir aufgefallen, dass die Scrollgeschwindigkeit (wenn der Frame kleiner wie das Formular ist) ziemlich langsam ist. Warum ist das so? Zuerst dachte ich, das liegt evtl. an den umfangreichen Formularen (JPanel mit GridBagLayout und ziemlich vielen Komponenten). Dann hab ich mir aber zum Testen nochmal eine kleinere Anwendung erstellt, mit einem leeren JPanel in einem CardLayout. Dieses JPanel habe ich mit setPreferredSize grösser als den Frame gemacht, damit die Scrollbalken auftauchen. Und auch da bewegt sich mein Panel sehr langsam, wenn ich mit dem Mausrad rauf oder runter scrolle. Hab ich beim hinzufügen des Panels zum Scrollpane was falsch gemacht? Oder kann jemand sonst einen Fehler entdecken und mir weiterhelfen?

Hier kommt mal das Testprogramm (die zwei weiteren Panel im CardLayout sind nur zu Testzwecken angelegt und können nicht angezeigt werden, da es mir erst mal nur um die Scrollgeschwindigkeit geht):
Java:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;

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


public class Test
extends JFrame {


	public Test() {

		setTitle("Test");

		setSize(600, 400);
		
		// Frame auf dem Bildschirm zentrieren
		setLocationRelativeTo(getParent());

		add( BorderLayout.CENTER, new TestPanel() );

		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
		setVisible( true );

	}


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

	
	
	class TestPanel
	extends JPanel {

		CardLayout card;
		    
		public TestPanel() {
		    	
			card = new CardLayout();
		 
			this.setLayout(card);
		    	
			JPanel panel1 = new JPanel();
			JScrollPane scroll1 = new JScrollPane(panel1);
			panel1.setPreferredSize(new Dimension(800, 600));
		    	
			JPanel panel2 = new JPanel();
			JPanel panel3 = new JPanel();
		    	
			panel1.setBackground(Color.YELLOW);
			panel2.setBackground(Color.RED);
			panel3.setBackground(Color.BLUE);
		    	
			add(scroll1, "1");
			add(panel2, "2");
			add(panel3, "3");

		}
		 
		public void showPanel(String panel) {
			card.show(this, panel); 
		}
		
	}
	
}

Ergänzung: Eigentlich ist das mit dem CardLayout sogar egal. Wenn ich es einfach dem CENTER-Bereich des Frames hinzufüge, hab ich das gleiche. Das Panel lässt sich mit dem Mausrad nur sehr langsam scrollen. Also vermutlich hab ich da einen Fehler beim Zuweisen des Panels ins ScrollPane?
Java:
...
		TestPanel testPanel = new TestPanel();
		testPanel.setPreferredSize(new Dimension(800, 600));
		JScrollPane scroll1 = new JScrollPane(testPanel);

		add( BorderLayout.CENTER, scroll1 );
...
 
Zuletzt bearbeitet von einem Moderator:

Fu3L

Top Contributor
Java:
JScrollPane.getVerticalScrollBar().setUnitIncrement(15);

Setzt die Scrollgeschwindigkeit der ScrollBar ;)
 
C

Camino

Gast
Java:
JScrollPane.getVerticalScrollBar().setUnitIncrement(15);

Setzt die Scrollgeschwindigkeit der ScrollBar ;)

Hey cool, das funktioniert tatsächlich. Ich frag mich aber trotzdem, warum das standardmäßig so langsam scrollt. Ich bin mir auch nicht sicher, aber ich dachte, ich hätte schonmal Scrollpanes in einem Programm gehabt, die auch von alleine "normal schnell" gescrollt haben. Trotzdem danke für deine Hilfe und den Tipp.

Camino
 

Marco13

Top Contributor
Je nachdem, um was es da genau geht, kann man auch die GUI-Componente, die gescrollt werden soll, "Scrollable" implementieren lassen.

Mit einem JPanel nicht so sinnvoll, nur als schnell hingehacktes Beispiel
Java:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.*;

import javax.swing.*;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class ScrollTest
extends JFrame {


    public ScrollTest() {

        setTitle("Test");

        setSize(600, 400);

        // Frame auf dem Bildschirm zentrieren
        setLocationRelativeTo(getParent());

        add( BorderLayout.CENTER, new TestPanel() );

        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        setVisible( true );

    }


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



    class TestPanel
    extends JPanel {

        CardLayout card;

        public TestPanel() {

            card = new CardLayout();

            this.setLayout(card);

            JPanel panel1 = new ScrollablePanel();
            JScrollPane scroll1 = new JScrollPane(panel1);
            panel1.setPreferredSize(new Dimension(800, 600));

            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel();

            panel1.setBackground(Color.YELLOW);
            panel2.setBackground(Color.RED);
            panel3.setBackground(Color.BLUE);

            add(scroll1, "1");
            add(panel2, "2");
            add(panel3, "3");

        }

        public void showPanel(String panel) {
            card.show(this, panel);
        }

    }

}


class ScrollablePanel extends JPanel implements Scrollable
{
    public Dimension getPreferredScrollableViewportSize()
    {
        return getPreferredSize();
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 21;
    }
    public boolean getScrollableTracksViewportHeight()
    {
        return false;
    }
    public boolean getScrollableTracksViewportWidth()
    {
        return false;
    }
    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 21;
    }
}
 
C

Camino

Gast
Es handelt sich eigentlich tatsächlich nur um ein JPanel, welches gescrollt werden soll, weshalb wohl die erst Lösungsmöglichkeit (die Scrollgeschwindigkeit beim JScrollPane zu setzen) einfacher ist. Ich hatte mich schon gewundert und gedacht, das JPanel mit den Formularkomponenten wäre evtl. zu voll und ist deshalb so schwer/langsam zu scrollen, oder ich hab das irgendwie falsch zugewiesen. Na ja, ich werde dann diese Scrollgeschwindigkeit in meiner Anwendung global setzen und den Scrollpanes zuweisen.

Vielen Dank für eure Hilfe...

Camino
 
C

Camino

Gast
Sorry, musste das Thema nochmal aufmachen, aber mir ist gerade noch etwas beim Scrollen aufgefallen. Und zwar setzt das Scrollen des JPanels aus, wenn ich mich mit der Maus über einer JTable befinde. Soweit ich das nachvollziehen kann, ist dann der "Scrollfokus" auf der JTable, auch wenn diese garnicht so viele Elemente drinstehen hat, dass deren Scrollbalken angezeigt werden. Ist ein bisschen unschön, weil dann das Scrollen der Seite (des Panels) blockiert wird und der User evtl. nicht genau erkennen kann, warum. Gibt es denn eine Möglichkeit, dass so zu machen, wie ich es auch in Webbrowsern funktioniert, nämlich dass wenn sich die Maus auf der Tabelle befindet und dort gescrollt werden kann, dass dann innerhalb der Tabelle gescrollt wird, bis in der Tabelle oben oder unten der Rand erreicht wird, und dann wird die Seite (Panel) weitergescrollt.
 

Fu3L

Top Contributor
2 Dinge die mir so einfielen: 1) Die Scrollbalken nur "AS_NEEDED" anzeigen, vllt klappts dann oder aber für den Fall, dass die nicht benötigt werden setMouseWheelScrollingEnabled(false); aufzurufen.. Aber habs jetzt nicht getestet...
Sonst muss wohl jemand anders ran, der wirklich die Zusammenhänge mit den ganzen Events und co im Detail kennt^^
 

Marco13

Top Contributor
MouseWheel und Scrolling sind ein bißchen kompliziert. Schon das beschriebene Verhalten beim Browser ist (bei mir) so, dass man den Inneren Bereich bis zum Ende scrollt, aber dann NUR den äußeren Bereich scrollen kann, wenn man die Maus zwischendurch bewegt hat. Aber auf anderen Betriebssystemen und anderen Browsern bzw. anderen Programmen kann das schon wieder ganz anders sein. Speziell für Java hatte ich mir das kürzlich mal genauer angesehen: Er schickt den Event an die Component, die sich unter der Maus befindet, und wenn die sie nicht verarbeitet, wird eine Kopie des Events nach oben gereicht, und geschaut, ob irgendeine andere Component diesen Event verarbeiten will - ziemlich crank.
(Sorry, keine konkrete Antwort auf die Frage, aber ... wollte nur andeuten dass das vom OS abhängen und ggf. kompliziert sein könnte... aber vielleicht weiß ja jemand zufällig die Antwort...)
 
C

Camino

Gast
OK, danke für eure Infos und Tipps. Ich werde mir das nochmal genauer anschauen, und falls es keine wirklich brauchbare Lösung gibt, muss ich halt mit diesem Effekt leben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
H Scroll-Problem bei JScrollPane+JTextPane AWT, Swing, JavaFX & SWT 2
S JTextarea in JScrollpane -> scroll, Zeilenbeschränkung AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
P Swing JScrollpane AWT, Swing, JavaFX & SWT 2
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
J JScrollPane Probleme AWT, Swing, JavaFX & SWT 3
S Swing JScrollPane verliert Scrollbars AWT, Swing, JavaFX & SWT 5
D Swing JTable in JScrollpane beliebig verbreitern AWT, Swing, JavaFX & SWT 5
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
J Swing Unteren Abstand für JTable in JScrollPane festlegen AWT, Swing, JavaFX & SWT 10
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
S Swing JScrollpane und ViewPort AWT, Swing, JavaFX & SWT 4
D JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 12
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5
H jscrollpane AWT, Swing, JavaFX & SWT 12
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
A Problem mit JScrollPane in einer JScrollpane AWT, Swing, JavaFX & SWT 4
B JScrollPane Problem AWT, Swing, JavaFX & SWT 25
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben