JPanel in JScrollPane: Probleme mit Scrollleisten

Status
Nicht offen für weitere Antworten.

benner

Aktives Mitglied
Ich möchte auf ein JPanel (Search) ein JScrollPane setzen, welches wiederrum ein JPanel (Output) enthalten soll. Ich habe output so gewählt, dass es wesentlich größer als das JScrollPane ist, jedoch sind die Scrollbalken nicht aktiv.

Code:
public class Search extends JPanel
{
    Search(int width, int height,final ArrayList data)
    {
        output = new Output(180,20,800, 800);
        spScroll = new JScrollPane(	    output,
                                                    ScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        spScroll.setBounds(170,10,400, 400);
        spScroll.setAutoScrolls(true);
				
        this.add(spScroll);
		
        this.updateUI();
    }
}


public class Output extends JPanel
{
	Output(int x, int y,int width, int height)
	{
		this.setBounds(x,y,width,height);
		this.setForeground(Color.RED);
	}
	
	@Override 
	public void paint(Graphics g)
	{
		g.drawString("test",500,500);
	}

}

Oft habe ich gesehen, dass folgende Methoden verwendet werden, ohne jedoch herauszubekommen, was sie bedeuten. Die API erklärt da auch nichts weiter...

1. spScroll.getViewport().setView(jp);
2. spScroll.getViewport().setViewSize(new Dimension(x,y));

Ich vermute erstere Methode legt den Client des JScrollPanes fest? Für die zweite habe ich nicht einmal eine Vermutung.

Außerdem habe ich in einem anderen Forum gelesen, dass man möglichst nicht mit setbounds(), sondern mit setLocation() und setPreferredSize() arbeiten sollte. Warum? Ich habe das auch versucht, aber wenn ich das tue, bekomme ich im Panel das JScrollPane gar nicht erst angezeigt.

Fragen über Fragen, die ganze Thematik ist mir noch ziemlich unverständlich. Ich hoffe mir kann jemand weiterhelfen.
 

The_S

Top Contributor
Versuch mal die Größe von Output mit setPreferredSize(Dimension) anstelle mit setBounds zu setzen. Evtl. liegt es daran.

BTW ist ein null-layout keine gute Wahl, gibt doch so viele schöne Layoutmanager, warum verwendest du die nicht?
 

benner

Aktives Mitglied
benner hat gesagt.:
Außerdem habe ich in einem anderen Forum gelesen, dass man möglichst nicht mit setbounds(), sondern mit setLocation() und setPreferredSize() arbeiten sollte. Warum? Ich habe das auch versucht, aber wenn ich das tue, bekomme ich im Panel das JScrollPane gar nicht erst angezeigt.

Dieses Problem tritt auch jetzt wieder auf: das JScrollPane wird gar nicht erst angezeigt. Und die Frage nach dem Warum wäre auch sehr interessant...

Das Null-Layout verwende ich, weil ich gern die totale Kontrolle über die Anordnung habe :meld:
 

The_S

Top Contributor
Also bei mir funktioniert dein Code ohne Probleme, mal ausgenommen, dass eine höhe von 10 für ein JScrollPane ein wenig klein ist und du mit JPanel#setForeground überhaupt gar nichts bewirkst.

Im Gegenteil, das Null-Layout lässt dich sehr schnell die Kontrolle verlieren. Schon allein auf anderen Windows-Versionen (geschweige denn Linux, Mac, Solaris, etc.) wird deine GUI komplett verzerrt. Schau dir doch mal GridBagLayout bzw. TableLayout bzw. FormLayout von www.jgoodies.com an. Damit hast du wirklich "totale Kontrolle"
 

benner

Aktives Mitglied
Komisch...also bei mir bewirkt setForeground(Color.RED) ne rote Schrift auf dem Panel. Und 10 ist doch nicht die Höhe, sondern die y-Koordinate der Ecke des JScrollPanes...

Funktioniert, wenn du meinen Code bei dir ausführst, auch das Scrollen des Panels? Denn darum ging es ja ursprünglich.

Das mit den Layouts schau ich mir mal an, wenn ich Zeit habe, danke :###
 

The_S

Top Contributor
benner hat gesagt.:
Komisch...also bei mir bewirkt setForeground(Color.RED) ne rote Schrift auf dem Panel.

Achso, ich dachte jetzt du willst damit bewirken, dass dein JPanel rot wird. An die Schrift hab ich gar net gedacht. Sry, mein Fehler :oops:

benner hat gesagt.:
Und 10 ist doch nicht die Höhe, sondern die y-Koordinate der Ecke des JScrollPanes...

Das kommt davon, wenn man nicht mit setBounds arbeitet. Hab gedacht es kommt zuerst höhe und breite und dann koordinaten. Nochmal mein Fehler :( .

benner hat gesagt.:
Funktioniert, wenn du meinen Code bei dir ausführst, auch das Scrollen des Panels? Denn darum ging es ja ursprünglich.

Jup, musste ihn zwar geringfügig anpassen, da er so, wie er dasteht natürlich nicht ausführbar ist, aber im Grunde läuft er. Dennoch wäre es evtl. besser wenn du ein kleines KSKB (kleines, selbstkompilierendes beispiel) posten könntest um sicher zu gehen.

benner hat gesagt.:
Das mit den Layouts schau ich mir mal an, wenn ich Zeit habe, danke :###

k
 

benner

Aktives Mitglied
Also ich habe mal versucht das Problem auf das Wesentliche zu reduzieren, was nicht so einfach war, wie ich gedacht hatte...

Code:
import java.awt.Color;
import java.awt.Graphics;

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


public class Main extends JFrame
{
    Output output = new Output(180,20,800,800);

    Main()
    {
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(0,0,800,600);
        this.setLayout(null);
        this.setBackground(Color.GREEN);

        Output output = new Output(0,0,400,400);

        JScrollPane spScroll = new JScrollPane(    output,
                                                                    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                                                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        spScroll.setAutoscrolls(true);
        spScroll.setBounds(170,10,output.getWidth()-185, output.getHeight()-20);

        output.updateUI();
        this.add(spScroll);
        spScroll.updateUI();
//      this.repaint();
        System.out.println(output.getWidth()+" "+output.getHeight());
    }
    
    public static void main(String[] args)
    {
        Main pane = new Main();
        pane.repaint();
    }

    public class Output extends JPanel
    {
        Output(int x, int y,int width, int height)
        {
            this.setBounds(x,y,width,height);
            this.setForeground(Color.RED);
            System.out.println(width+" "+height);
        }

        @Override
        public void paint(Graphics g)
        {
            g.drawString("test",this.getWidth()-100,this.getHeight()-100);
        }
    }
}

Erstes Problem: erst nachdem man die Größe des Fensters verändert hat, wird das JScrollPane sichtbar. Da muss man irgendwas noch updaten nehme ich an, aber ich hab nicht herausgefunden was?
Code:
SwingUtilities.updateComponentTreeUI();
brachte eine NullPointerException :?
Zweites Problem: Das Panel output sollte eigentlich einen grünen Rahmen vom Frame sichtbar lassen, verdeckt es aber irgendwie komplett...

Aber diese Probleme sind ja nicht mein Hauptanliegen und treten im vollständigen Programm auch nicht auf. Wie man sieht, wird das Panel Output mit der Größe 400,400 initialisiert (1.Ausgabe) und dann aber in der Größe dem JScrollPane angepasst (2.Ausgabe). Genau das will ich aber verhindern, was ja der Grund ist, warum ich das JScrollPane überhaupt verwende. Ich hoffe so ist mein Problem ein wenig deutlicher geworden.

@Hobbit_Im_Blutrausch: Ist das jetzt das, was du mit KSKB gemeint hattest, oder schießt es etwas am Ziel vorbei?

Auch für konstruktive Kritik, die nicht explizit mit meinem Problem zu tun hat, bin ich jederzeit dankbar :meld:
 

The_S

Top Contributor
Also dass du erst die größe verändern musst liegt daran, dass setVisible nicht als letztes im konstruktor aufgerufen wurde. Mach das und es sollte gehen. Warum es zu den Darstellungsfehlern kommt, kann ich dir leider nicht sagen, hat vermutlich was mit dem null-layout zu tun.
 

benner

Aktives Mitglied
Ich habe mal einen ActionListener an das Panel gehangen, der nach jeder Größenänderung die Größe des Panels angibt. Sobald die Fenstergröße einmal verändert wurde, ist das Panel wieder an die Größe des JScrollPanes angepasst worden...
Auf den Verdacht hin, dass das Ganze irgendwie mit dem SetBounds zu tun hat, habe ich setBounds durch setLocation und setPreferredSize ersetzt und einen kleinen "Fehler" behoben (ich hatte output zweimal definiert):

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

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


public class Main extends JFrame
{
    Main()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(0,0,800,600);
        this.setLayout(null);
        this.setBackground(Color.GREEN);
        this.setVisible(true);
        
        final Output output = new Output(0,0,400,400);

        this.addComponentListener(new ComponentListener()
        {
            public void componentHidden(ComponentEvent ce1){}
            public void componentMoved(ComponentEvent ce2){}
            public void componentShown(ComponentEvent ce3){}
            public void componentResized(ComponentEvent ce4)
            {
                System.out.println(output.getWidth()+" "+output.getHeight());
            }
        });

        JScrollPane spScroll = new JScrollPane
            (output,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

            spScroll.setAutoscrolls(true);
            //spScroll.setBounds(170,10,output.getWidth()-185, output.getHeight()-20);
            spScroll.setPreferredSize(new Dimension(200,200));
            spScroll.setLocation(170, 10);
            output.updateUI();

            this.add(spScroll);
            System.out.println(output.getWidth()+" "+output.getHeight());
        }

        public static void main(String[] args)
        {
            Main pane = new Main();
            pane.repaint();
        }

        public class Output extends JPanel
        {
            Output(int x, int y,int width, int height)
            {
                this.setBounds(x,y,width,height);
                this.setForeground(Color.RED);
                System.out.println(width+" "+height);
            }

            @Override
            public void paint(Graphics g)
            {
                g.drawString("test",this.getWidth()-100,this.getHeight()-100);
            }
        }
}

Das Problem ist jetzt, dass das JScrollPane nicht angezeigt wird. Ich hab das noch nie erlebt, dass ich eine Sache so gründlich nicht durchschaue wie das hier. Ich werd mich auch nochmal (erneut) auf die Suche nach Tutorials machen.
Wenn jemand dazu einen Tip hat, bin ich auch dankbar, oder wenn jemandem was zu meinem Problem hier einfällt
 

benner

Aktives Mitglied
OK ich glaub ich hab sowas wie ne Lösung gefunden, falls es jemanden interessiert =)

Er liegt in dem Panel, das ins JScrollPane eingefügt werden soll, da muss man statt setBounds() bzw. setSize() die Methode setPreferredSize() verwenden, dann wird das Panel nicht verkleinert...
 

benner

Aktives Mitglied
Ja stimmt hast du :oops: Wahrscheinlich hat es zu dem Zeitpunkt nicht nur an dieser einen Sache gehangen, sondern an mehreren...oder ich war zu blöd, wer weiß :lol:
Danke auf jeden Fall nochmal für deine Zeit und Hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JScrollpane mit JPanel und Probleme AWT, Swing, JavaFX & SWT 4
N Probleme mit new JScrollPane(jPanel) AWT, Swing, JavaFX & SWT 6
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren 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
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
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
T Swing JPanel in JScrollPane mit maximaler Größe AWT, Swing, JavaFX & SWT 8
R JPanel von JScrollPane entfernen und hinzufügen AWT, Swing, JavaFX & SWT 3
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
K JScrollPane IN JPanel? AWT, Swing, JavaFX & SWT 2
S Swing Problem mit JCheckBox auf JPanel in JScrollPane AWT, Swing, JavaFX & SWT 8
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
X Swing JScrollPane und JPanel AWT, Swing, JavaFX & SWT 3
C JPanel mit FlowLayout in JScrollPane - keinen Scrollbalken AWT, Swing, JavaFX & SWT 2
G Swing JScrollPane auf JPanel AWT, Swing, JavaFX & SWT 3
B JPanel zu groß in JScrollPane AWT, Swing, JavaFX & SWT 5
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3
J Swing JScrollPane fasst JPanel und Groesse des JPanels soll sich aendern AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
A Swing Zeilenanzeige: JPanel als Header für JScrollPane AWT, Swing, JavaFX & SWT 7
H Swing Darstellungsproblem JPanel in JPanel in JScrollpane in JSplitPane AWT, Swing, JavaFX & SWT 4
MQue JPanel und JScrollPane AWT, Swing, JavaFX & SWT 8
S JPanel-Dim reicht nicht aus, JScrollPane AWT, Swing, JavaFX & SWT 8
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
R JPanel in JScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 7
B Anfängerfrage zu Swing (JPanel und JScrollPane) AWT, Swing, JavaFX & SWT 16
J JPanel mit JScrollPane und FlowLayut AWT, Swing, JavaFX & SWT 3
N Mehrere JTextArea in einem JPanel und eine JScrollPane AWT, Swing, JavaFX & SWT 3
C JScrollPane ignoriert JPanel mit überschriebener pai.nt() AWT, Swing, JavaFX & SWT 11
G 2x JPanel im JScrollPane (Hintergrundbild in JScrollPane) AWT, Swing, JavaFX & SWT 9
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
W JPanel in JScrollPane? AWT, Swing, JavaFX & SWT 2
M JPanel JTable in einem JScrollPane AWT, Swing, JavaFX & SWT 6
M JScrollPane im JPanel im JFrame SWING AWT, Swing, JavaFX & SWT 4
S JPanel in JScrollPane AWT, Swing, JavaFX & SWT 11
P JPanel in JScrollPane -> funktioniert nicht(vertikal scro AWT, Swing, JavaFX & SWT 5
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
T Automatische Grössenanpassung JPanel / JScrollpane AWT, Swing, JavaFX & SWT 3
R JPanel eingebettet in einem JScrollPane AWT, Swing, JavaFX & SWT 3
M JScrollPane auf JPanel - Resizing - Größe verändern AWT, Swing, JavaFX & SWT 10
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
J JPanel in JScrollPane Hilfe bitte AWT, Swing, JavaFX & SWT 2
S JPanel in JScrollPane in der Breite begrenzen AWT, Swing, JavaFX & SWT 3
S Größe von jPanel bzw. jTextArea (in jScrollpane) anpassen AWT, Swing, JavaFX & SWT 1
B Schachtelung von JTable und JScrollpane in JPanel? AWT, Swing, JavaFX & SWT 2
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben