JScrollPane

Phenix

Bekanntes Mitglied
Hey LEute,

ich habe ein dringendes Problem. Ich möchte gerne einen Scrollbaren Bereich / Scrollbares Panel haben, da der darzstellende Inhalt größer ist, als das Fenster. Ich bekomme es aber partout nicht hin. So sieht es bislang aus:

Java:
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
 *
 * @author Lukas
 */
public class ShaftGroupFrame extends JFrame {

    private ShaftPanel[] shaftPanels;
    private int shafts, floors, width, height;
    private Color bgColor;
    private static JPanel bgPanel;
    private static ShaftGroupFrame instance = null;
    private GuiValues values = GuiValues.getInstance();
    private JScrollPane scroll;

    private ShaftGroupFrame() {
        bgPanel = new JPanel();
        this.add(bgPanel);
    }

    public static ShaftGroupFrame getInstance() {
        if (instance == null) {
            instance = new ShaftGroupFrame();
        }
        return instance;
    }

    private void setLayout() {
        this.setLayout(null);
        this.setVisible(true);
        this.setSize(width + 10, height + 30);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);


        bgPanel.setLayout(null);
        bgPanel.setBackground(bgColor);
        bgPanel.setSize(this.getWidth(), this.getHeight());
    }

    private void createComponents() {
        for (int i = 0; i < shafts; i++) {
            shaftPanels[i] = new ShaftPanel(i);
        }
    }

    private void addComponents() {
        for (int i = 0; i < shafts; i++) {
            bgPanel.add(shaftPanels[i]);
            shaftPanels[i].setBounds(i * 360, 10, 330, this.getHeight());
        }
    }

[...]

Das bgPanel ist das, auf dem alle Komponenten sitzen. Dieses oder die einzelnen shafts sollen scrollbar sein. Habe es folgendermaßen versucht:

Java:
 private JScrollPane scroll;

 private ShaftGroupFrame() {
        bgPanel = new JPanel();
        scroll=new JScrollPane(bgPanel);
        this.add(scroll);
    }
[...]

Allerdings sehe ich dann nur ein graues Kästchen.

Danke schonmal
 
S

SlaterB

Gast
bgPanel ist doch auch nur ein new JPanel();
da ist nix drin, was soll stattdessen angezeigt werden?

addComponents() usw. wird nicht aufgerufen, falls das später oder in nicht gezeigten Code-Teilen passiert,
kann ja niemand beurteilen was daraus wird, außer dass es höchstwahrscheinlich im Chaos endet

setLayout() sieht auch verwegen aus, wird zum Glpcl nicht aufgerufen,
irgendwo null-Layout und dann vielleicht ein JScrollPane ohne Größenangabe einfügen..

ganz wichtig auch:
möglichst
setVisible(true)
als aller letztes aufrufen, nachdem alles andere hinzugefügt wurde, ist für null-Layout vielleicht weniger wichig,
alle anderen richtigen Layouts werden aber genau zu diesem Zeitpunkt berechnet
 

Phenix

Bekanntes Mitglied
Hey danke schonmal.
Hier einmal der vollständige code des Frames ohne den Einsatz des ScrollPanes.

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nl.fontys.sevenlo.prj32.gui;

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
 *
 * @author Lukas
 */
public class ShaftGroupFrame extends JFrame {

    private ShaftPanel[] shaftPanels;
    private int shafts, floors, width, height;
    private Color bgColor;
    private static JPanel bgPanel;
    private static ShaftGroupFrame instance = null;
    private GuiValues values = GuiValues.getInstance();
    private JScrollPane scroll;

    private ShaftGroupFrame() {
        bgPanel = new JPanel();
        this.add(bgPanel);
    }

    public static ShaftGroupFrame getInstance() {
        if (instance == null) {
            instance = new ShaftGroupFrame();
        }
        return instance;
    }

    private void setLayout() {
        this.setLayout(null);
        this.setVisible(true);
        this.setSize(width + 10, height + 30);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);


        bgPanel.setLayout(null);
        bgPanel.setBackground(bgColor);
        bgPanel.setSize(this.getWidth(), this.getHeight());
    }

    private void createComponents() {
        for (int i = 0; i < shafts; i++) {
            shaftPanels[i] = new ShaftPanel(i);
        }
    }

    private void addComponents() {
        for (int i = 0; i < shafts; i++) {
            bgPanel.add(shaftPanels[i]);
            shaftPanels[i].setBounds(i * 360, 10, 330, this.getHeight());
        }
    }

    public JPanel getDoorPanel(int shaft, int currentFloor) {
        return shaftPanels[shaft].getDoorPanel(currentFloor);
    }

    public JPanel getFloorPanel(int shaft, int currentFloor) {
        return shaftPanels[shaft].getFloorPanel(currentFloor);
    }

    public JPanel getShaft(int shaftNumber){
        return shaftPanels[shaftNumber];
    }

    public void update() {
        //Save values
        this.shafts = values.getShafts();
        this.floors = values.getFloors();
        this.bgColor = values.getColor();

        this.height = floors * 450;
        this.width = shafts * 370;

        //Reconfigure whole panel
        setLayout();
        bgPanel.removeAll();
        bgPanel.repaint();
        shaftPanels = new ShaftPanel[shafts];
        createComponents();
        addComponents();
        repaint();
    }
}

Damit sind vielleicht ein paar unklarheiten ausgeräumt?!?
Dem bgPanel werden Dinge hinzugefügt in der MEthode addComponents();

ICh weiss jetzt leider nicht genau, wie ich das jetzt genau machen soll. :-(
 
Zuletzt bearbeitet:
S

SlaterB

Gast
addComponents() wird in update() aufgerufen, aber update() ruft niemand auf, oder?
eine main-Methode fehlt auch, vielleicht gehört da noch mehr dazu,

vor Zeile 91 gehört noch
validate();
 

Phenix

Bekanntes Mitglied
Ja, es gehört noch mehr dazu. DIe Methode update() wird von außen aufgerufen. Aber wie gesagt, es geht darum, dass ich Scrollen können möchte.
Das ganze stellt einen oder mehrere Aufzüge dar, die eine dynamische Anzahl von Stockwerken anfahren können sollen. Deswegen kann das ganze recht hoch werden. Am besten wäre es, wenn die einzelnen Shafts (Aufzugschächte) scrollbar wären.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
tja, dann jeweils ein JScrollPane drum?
ich kann nur generell empfehlen auf das null-Layout zu verzichten und immer klein anzufangen, z.B. mit nur einem Aufzug,

irgendwas im Programm ändern, wahrscheinlich danach noch mit 'ok, das ist schön, jetzt noch hier ..', das mache ich persönlich lieber nicht ;)
 

Phenix

Bekanntes Mitglied
Ok. Jetzt habe ich es folgendermaßen:

Java:
       scroll=new JScrollPane(shaftPanels[0]);
        this.add(scroll);
        scroll.setSize(getWidth(), getHeight());
        scroll.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
in der Methode update(). Jetzt zeigt er den Shaft Nummer 0 an. Das ist schonmal ein fortschritt. Einen Scrollbalken sehe ich allerdings immer noch nicht :-( Was kann denn da noch falsch sein??

Man ey!
GUI in Java ist echt grausam. Da lob' ich mir VB oder sonstiges.
 

Michael...

Top Contributor
Ob der Scrollbalken angezeigt wird hängt von der Größe der Komponente im Viewport der ScrollPane ab. Hat bzw. welche PreferredSize hat den "shaftPanels[0]"?
 

Phenix

Bekanntes Mitglied
Ok stimmt. Thx.

Jetzt siehts testweise so aus:

Java:
        scroll = new JScrollPane(shaftPanels[0]);
        this.add(scroll);
        scroll.setSize(400, 800);
        shaftPanels[0].setSize(800, 1000);
Jetzt ist der Inhalt ja eindeutig größer, als das ScrollPanel. Trotzdem kann man nicht scrollen. Die Gui ist einfach nur zum Teil sichtbar :-(
 
S

SlaterB

Gast
bitte in einem vollständigen Programm, und interne Klassen wie ShaftPanel müssen es nicht sein,
es geht meist auch ein Dummy-JPanel mit Background grün oder so
 
S

SlaterB

Gast
aber doch ein ShaftPanel, das heißt dass du diese unbekannte Klasse zum vollständigen Programm auch posten müsstest,
und wer weiß wieviele Klassen noch,
ich brauche auf jeden Fall was mit Copy, Paste, Run und dann sehe ich mir bei mir die GUI,
mit allem anderen gibt es zu viele unbekannte Code-Stellen, die darauf Einfluss haben können,
 

Phenix

Bekanntes Mitglied
Seh ich das richtig, dass JPanels nicht als solche Komponenten zählen, weswegen ein Fenster die Größe ändert. Also ich mein das so:

Ich hab noch was rum probiert und dann ist mir aufgefallen, egal wie groß das Panel war was im ScrollPane sitzt, nie wurde gescrollt. Sobald aber Buttons drin waren, kam der Scrollbalken.

Beispiel:
Java:
Frame:


import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Phenix
 */
public class Frame extends JFrame implements ScrollPaneConstants{

    private JScrollPane scroll;
    private Panel1 panel;
    private JButton[] buttons=new JButton[51];

    public Frame(){
        panel=new Panel1();
        panel.setSize(700,700);
        panel.setBackground(Color.BLUE);
        for(int i=0; i<50; i++){
            buttons[i]=new JButton();
            buttons[i].setBounds(0, i*32, 30, 30);
            panel.add(buttons[i]);
        }

        scroll=new JScrollPane(panel);
        scroll.setBounds(0,0,300,300);
        scroll.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
        
        this.setVisible(true);
        this.setLayout(null);
        this.setBackground(Color.RED);
        this.setSize(400,400);
        this.add(scroll);
        System.out.println(scroll.getWidth());
    }

}
//Hier kommt ein Scrollbalken

Scrollt nicht:
Java:
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Phenix
 */
public class Frame extends JFrame implements ScrollPaneConstants{

    private JScrollPane scroll;
    private Panel1 panel;
    private JButton[] buttons=new JButton[51];

    public Frame(){
        panel=new Panel1();
        panel.setSize(700,700);
        panel.setBackground(Color.BLUE);

//ohne Buttons
        scroll=new JScrollPane(panel);
        scroll.setBounds(0,0,300,300);
        scroll.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
        
        this.setVisible(true);
        this.setLayout(null);
        this.setBackground(Color.RED);
        this.setSize(400,400);
        this.add(scroll);
        System.out.println(scroll.getWidth());
    }

}
//Scrollt nicht
 

Phenix

Bekanntes Mitglied
Ok! Ich hab nun überprüfen können, dass es wirklich daran liegt, dass ich keinen LayoutManager benutzt habe. Ich find diese aber echt scheisse und es klappt so mit der Gui soweit und will nich wieder alles umstellen. Gibt es keinen Weg das zu umgehen? Also damit es trotz null-layout funktioniert?
 

javimka

Top Contributor
Die JScrollPane zeigt dann JScrollBars, wenn die bevorzugte Grösse der View unterschritten würde. Diese kannst du mit setPreferredSize setzen.
Füge mal folgendes in deinen Code ein:
[c]panel.setPreferredSize(new Dimension(700,700));[/c]
 

Spin

Top Contributor
Hey ho, Layoutmanager sind aber ziemlich angenehm und vereinfachen oder komplizieren die Darstellung.

Bei einem null-Layout benutzt du setBounds() um alle Komponenten auszurichten und das ist auch richtig.
Doch wirdst du Probleme haben, wenn du das Fenster vergrößerst.

Es gibt auch leider keine andere Möglichkeit aus du holst ein Panel und übergibst diesen ein Layout.

Weiterhin gebe ich dir den Tip , setVisible(true) immer am schluss deines Konstruktors aufzurufen. grüße
 

Phenix

Bekanntes Mitglied
Oh. Ja, das mit dem setPreferredSize() das funktioniert. Vielen Dank Leute :toll:
Aber etwas doof ist das Ganze doch schon oder?


Close() ;-)
 

javimka

Top Contributor
Eigentlich solltest du wenn immer möglich ein Layout verwenden, dann hast du dieses Problem weniger. Aber ab und zu bringen sie einen schon zur Verzweiflung ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
M JScrollPane scrollt nicht Java Basics - Anfänger-Themen 2
D JScrollPane mit TextArea Java Basics - Anfänger-Themen 5
N JList + DefaultListModel + JScrollPane --> ensureIndexIsVisible funktioniert nicht immer Java Basics - Anfänger-Themen 1
T JScrollPane in den Code einbauen Java Basics - Anfänger-Themen 5
O JScrollPane zu gross für JTable Java Basics - Anfänger-Themen 2
A JScrollPane nicht sichtbar Java Basics - Anfänger-Themen 5
S JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 6
N jScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 13
L Jscrollpane nach zoomen anpassen Java Basics - Anfänger-Themen 20
C JScrollPane + JTextArea scrollt nicht Java Basics - Anfänger-Themen 2
T JScrollPane nicht scrollbar (mit KSKB!) Java Basics - Anfänger-Themen 4
T JScrollPane: Slider programmgesteuert verschieben? Java Basics - Anfänger-Themen 4
Kenan89 JScrollPane, aber kein Scrollbalken Java Basics - Anfänger-Themen 4
T JScrollPane funktioniert nicht Java Basics - Anfänger-Themen 7
D jScrollPane Problem Java Basics - Anfänger-Themen 16
JStickman JTree, JScrollPane, Liste mit graphischer Suchleiste - Dateimanager Java Basics - Anfänger-Themen 10
A Button das JScrollPane aktualisiert Java Basics - Anfänger-Themen 11
S JScrollPane verhält sich nicht so wie gedacht Java Basics - Anfänger-Themen 2
T JScrollPane ganz runter Scrollen Java Basics - Anfänger-Themen 4
T JScrollPane resized nicht richtig... Java Basics - Anfänger-Themen 4
Z Label verschwindet in JScrollPane Java Basics - Anfänger-Themen 7
N JScrollPane repaint(); geht nicht Java Basics - Anfänger-Themen 4
R JScrollPane in JTextArea benutzen Java Basics - Anfänger-Themen 10
L JPanel vergrößern bis JScrollPane nicht mehr zu sehen Java Basics - Anfänger-Themen 7
O JScrollPane , JScrollBar Java Basics - Anfänger-Themen 3
Z JScrollPane zeigt Zeit als Datum Java Basics - Anfänger-Themen 5
E Breite des Schiebers in JscrollPane verändern Java Basics - Anfänger-Themen 2
T JScrollPane soll rechts gescrollt gezeichnet werden Java Basics - Anfänger-Themen 5
J JScrollPane, Regler-Problem Java Basics - Anfänger-Themen 3
J JScrollPane swing Java Basics - Anfänger-Themen 8
H JTable in JScrollPane: Scrollbar wird nicht angezeigt. Java Basics - Anfänger-Themen 2
H2SO3- JScrollPane will nicht scrollen Java Basics - Anfänger-Themen 3
_deleted Mehrere Panels untereinander im JScrollPane Java Basics - Anfänger-Themen 4
J JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 4
A JScrollPane aktualisiert nicht Java Basics - Anfänger-Themen 2
7 Java Swing: Wie JScrollPane zur JList hinzufügen? Java Basics - Anfänger-Themen 12
C jTabbedPane JScrollPane und jPanel Java Basics - Anfänger-Themen 3
S JScrollPane und JPanel Java Basics - Anfänger-Themen 2
J JScrollBar JScrollPane Java Basics - Anfänger-Themen 9
Q Anwendung eines JScrollPane Java Basics - Anfänger-Themen 2
M JScrollPane Java Basics - Anfänger-Themen 7
M Probleme mit JScrollPane Java Basics - Anfänger-Themen 5
G JScrollPane Java Basics - Anfänger-Themen 5
S JScrollPane: Scrollbalken werden nicht angezeigt Java Basics - Anfänger-Themen 4
P Brauche Hilfe für JPanel im JScrollPane und Abstände Java Basics - Anfänger-Themen 2
M VisualEditor, Jlist und JScrollPane Java Basics - Anfänger-Themen 9
M JScrollPane soll inhalt zentrieren Java Basics - Anfänger-Themen 3
C Automatischer Umbruch bei JScrollPane? Java Basics - Anfänger-Themen 5
G JScrollPane + JTable + Autoscroll uvm. Java Basics - Anfänger-Themen 5
N JScrollPane mit JTextArea Java Basics - Anfänger-Themen 4
I Autoscrolling im JScrollPane Java Basics - Anfänger-Themen 3
H JScrollPane -> Problem bei ScrollBar Java Basics - Anfänger-Themen 3
lin JScrollPane & OutOfMemoryError Java Basics - Anfänger-Themen 6
G JScrollPane in der Größe bestimmen Java Basics - Anfänger-Themen 11
R JScrollpane problem Java Basics - Anfänger-Themen 21
P JScrollPane an JTextArea anhängen Java Basics - Anfänger-Themen 3
C JScrollPane ohne Rahmen? Java Basics - Anfänger-Themen 2
M JScrollPane Java Basics - Anfänger-Themen 4
G Probleme mit JScrollPane Java Basics - Anfänger-Themen 3
M JScrollPane: Autoscroll Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben