Scrollbalken in JFrame

Hallo Leute,

habe das Forum durchsucht, aber leider keine Lösung gefunden die mir helfen konnte.
(Falls ich was übersehen haben sollte, entschuldigt, heut ist mein erster Tag 🙂 )

Ich habe ein JFrame mit 3 JPanels drin (in denen später jeweils noch Textfelder etc kommen).
Diesem JFrame würde ich gerne Scrollbalken verpassen.

Ich hab zwar mehreres versucht, leider erfolglos, deshalb habe ich euch jetzt wieder den "reinen" Quellcode ohne Versuche gepostet:


Java:
package marktapp.gui;

import java.awt.Color;

import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MarktApp{

	
	private JFrame window;
	private JPanel marketPanel;
	private JPanel applyPanel;
	private JPanel answerPanel;
	private JPanel ratingPanel;

	
	
	
	public void showAddFrame(){
		
		window = new JFrame("Markt hinzufügen");
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		window.getContentPane().setBackground(Color.WHITE);
		window.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5));
		
		window.setSize(500, 700);
		window.setLocation(500,0);
		window.setVisible(true);
		
		
		
		marketPanel = new JPanel();
		marketPanel.setBackground(new Color(235,235,235));
		marketPanel.setPreferredSize(new Dimension(400,300));
		
		
		
		applyPanel = new JPanel();
		// Hintergrundfarbe: Ivory 2
		applyPanel.setBackground(new Color(224,224,224));
		applyPanel.setPreferredSize(new Dimension(400,300));
		
		answerPanel = new JPanel();
		answerPanel.setBackground(new Color(235,235,235));
		answerPanel.setPreferredSize(new Dimension(400,300));
		
		
		
		
		
		window.add(marketPanel);
		window.add(applyPanel);
		window.add(answerPanel);
		
		
		
		
	}
	
	public static void main(String[] args) {
		

		MarktApp marktApp = new MarktApp();
		marktApp.showAddFrame();
	}

}

Würde mich sehr freuen, wenn ihr mir weiterhelfen könntet!

Vielen Dank!

MfG
 
Hi!

Wie sahen deine Versuche bisher denn aus? Hast du nachgelesen, wie es funktioniert?

API-Dokumentation:
JScrollPane (Java Platform SE 6)

Lehrmaterialien:
How to Use Scroll Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Handbuch der Java-Programmierung, 5. Auflage
Galileo Computing :: Java ist auch eine Insel – 19.10 Container

Eine Komponente solltest du übrigens erst ganz am Ende sichtbar machen, also wenn ihr alle Subkomponenten hinzugefügt wurden.
 
Zuletzt bearbeitet:
Ich habe mal dein Codebeispiel an der entsprechenden Stelle auf GridBagLayout umgebaut. Damit gehts.

Java:
package marktapp.gui;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Color;

import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class MarktApp{

    private JFrame window;
    private JPanel marketPanel;
    private JPanel applyPanel;
    private JPanel answerPanel;
    private JPanel ratingPanel;


    public void showAddFrame(){

        window = new JFrame("Markt hinzufügen");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(500, 700);
        window.setLocationRelativeTo(null);


        marketPanel = new JPanel();
        marketPanel.setBackground(new Color(235,235,235));
        marketPanel.setPreferredSize(new Dimension(400,300));


        applyPanel = new JPanel();
        // Hintergrundfarbe: Ivory 2
        applyPanel.setBackground(new Color(224,224,224));
        applyPanel.setPreferredSize(new Dimension(400,300));


        answerPanel = new JPanel();
        answerPanel.setBackground(new Color(235,235,235));
        answerPanel.setPreferredSize(new Dimension(400,300));


        JPanel contentPanel = new JPanel(new GridBagLayout());
        contentPanel.setBackground(Color.WHITE);

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.insets = new Insets(10, 0, 0, 0);
        contentPanel.add(marketPanel, gbc);

        gbc.gridy = 1;
        gbc.insets = new Insets(10, 0, 10, 0);
        contentPanel.add(applyPanel, gbc);

        gbc.gridy = 2;
        gbc.insets = new Insets(0, 0, 10, 0);
        contentPanel.add(answerPanel, gbc);


        window.add(new JScrollPane(contentPanel));

        window.setVisible(true);
    }

    public static void main(String[] args) {

        MarktApp marktApp = new MarktApp();
        marktApp.showAddFrame();
    }

}
 
Vielen Dank euch beiden!! 🙂

So wie ich das verstehe, hab ich bis jetzt den Fehler gemacht, dass ich versucht habe,
alle 3 Panels in das JScrollPane "zu stecken".

Aber jetzt habe ich angelehnt an L-ectron-Xs Code, einen contentPanel erstellt, der die
3 Panels beinhaltet und diesen in das JScrollPane gesteckt.

So funktionierts.

Um ehrlich zu sein, habe ich extra FlowLayout benutzt, da mir das recht praktisch schien, da es die Komponenten, falls sie nicht mehr in eine Zeile passen, automatisch in die nächste Zeile verschiebt.
(Da lag ich wohl falsch?)

Jetzt sind die Scrollbalken zwar da, jedoch sind alle Panels in einer Zeile.

Ist es mit FlowLayout irgendwie möglich?
Wäre echt super, da man hier den geringsten Aufwand hat, beim Einfügen eines Panels in das contentPanel.

Vielen Dank! 🙂
 
Hier nochmal mein veränderter Code:

Java:
public void showAddFrame(){
		
		window = new JFrame("Markt hinzufügen");
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel contentPanel = new JPanel();
		
		
		contentPanel.setBackground(Color.WHITE);
		contentPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5));
		contentPanel.setSize(500, 700);
		
		window.setSize(500, 700);
		window.setLocation(500,0);
		
		
		
		
		marketPanel = new JPanel();
		marketPanel.setBackground(new Color(235,235,235));
		marketPanel.setPreferredSize(new Dimension(400,300));
		
		
		
		applyPanel = new JPanel();
		// Hintergrundfarbe: Ivory 2
		applyPanel.setBackground(new Color(224,224,224));
		applyPanel.setPreferredSize(new Dimension(400,300));
		
		answerPanel = new JPanel();
		answerPanel.setBackground(new Color(235,235,235));
		answerPanel.setPreferredSize(new Dimension(400,300));
		
		
		
		
		
		contentPanel.add(marketPanel);
		contentPanel.add(applyPanel);
		contentPanel.add(answerPanel);
		
		scroll = new JScrollPane(contentPanel);
		
		window.add(scroll);
		window.setVisible(true);
		
		
		
		
		
	}
 
Mit FlowLayout würde das so aussehen:
Java:
package marktapp.gui;

import java.awt.Color;

import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class MarktApp {

    private JFrame window;
    private JPanel marketPanel;
    private JPanel applyPanel;
    private JPanel answerPanel;
    private JPanel ratingPanel;


    public void showAddFrame(){

        window = new JFrame("Markt hinzufügen");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //window.getContentPane().setBackground(Color.WHITE);
        //window.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5));

        window.setSize(500, 700);
        window.setLocationRelativeTo(null);
        //window.setLocation(500,0);
        //window.setVisible(true);


        marketPanel = new JPanel();
        marketPanel.setBackground(new Color(235,235,235));
        marketPanel.setPreferredSize(new Dimension(400,300));


        applyPanel = new JPanel();
        // Hintergrundfarbe: Ivory 2
        applyPanel.setBackground(new Color(224,224,224));
        applyPanel.setPreferredSize(new Dimension(400,300));

        answerPanel = new JPanel();
        answerPanel.setBackground(new Color(235,235,235));
        answerPanel.setPreferredSize(new Dimension(400,300));


        JPanel contentPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 10));
        contentPanel.setPreferredSize(new Dimension(window.getPreferredSize().width, window.getSize().height));
        contentPanel.setBackground(Color.WHITE);

        contentPanel.add(marketPanel);
        contentPanel.add(applyPanel);
        contentPanel.add(answerPanel);
        
        window.add(new JScrollPane(contentPanel));

        window.setVisible(true);
    }

    public static void main(String[] args) {

        MarktApp marktApp = new MarktApp();
        marktApp.showAddFrame();
    }
}

Aber sobald du das Fenster maximierst oder in seinen Dimensionen veränderst, passt das FlowLayout auch die Positionen der Komponenten wieder an. D.h. sie werden, wenn es der Platz zulässt, wieder nebeneinander ausgerichtet.

Wenn du das nicht möchtest, kannst dich der oben gezeigten GridBagLayout-Variante bedienen.
 
Ich bins mal wieder 🙂

Soweit hat alles funktioniert.
Ich habe nun in den ersten Panels JLabels und Textfelder eingebaut.
Im ersten Panel wird alles wunderbar angezeigt: Schön links (bzw. WEST) gerichtet.

Im zweiten Panel wird jedoch alles zentriert angezeigt..ich seh den Fehler einfach nicht 🙁
Wie man im Quellcode sehen kann, habe ich auch ein neues GridBagConstraints-Objekt benutzt, jedoch erfolglos.

Würde mich über eure Hilfe freuen.
MfG

Hier der relevante Quellcode-Ausschnitt:

Java:
marketPanel = new JPanel();
		marketPanel.setBackground(new Color(235,235,235));
		marketPanel.setPreferredSize(new Dimension(400,150));
		marketPanel.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		
		gbc.insets = new Insets(0,0,0,0);
		gbc.anchor = GridBagConstraints.WEST;
		panelTitle = new JLabel("Markt hinzufügen");
		panelTitle.setFont(new Font(panelTitle.getFont().getFamily(), Font.BOLD, 18));
		marketPanel.add(panelTitle, gbc);
		
		/*gbc.insets = new Insets(20,0,0,0);
		gbc.anchor = GridBagConstraints.WEST;
		separator = new JSeparator(JSeparator.HORIZONTAL);
		separator.setPreferredSize(new Dimension(250,2));
		marketPanel.add(separator, gbc);*/
		
		gbc.insets = new Insets(10,0,0,0);
		gbc.gridy = 1;
		marketPanel.add(new JLabel("Datum:"), gbc);
		
		marketDate = new JTextField(10);
		marketPanel.add(marketDate, gbc);
		
		gbc.insets = new Insets(0,0,0,0);
		gbc.gridy = 2;
		marketPanel.add(new JLabel("Ort:"), gbc);
		
		marketCity = new JTextField(20);
		marketPanel.add(marketCity, gbc);
		
		gbc.gridy = 3;
		marketPanel.add(new JLabel("Bemerkung:"), gbc);
		marketComment = new JTextField(20);
		marketPanel.add(marketComment, gbc);
		
		
		
		// Bereich für die Eigenschaften der Bewerbung
		
		applyPanel = new JPanel();
		// Hintergrundfarbe: Ivory 2
		applyPanel.setBackground(new Color(224,224,224));
		applyPanel.setPreferredSize(new Dimension(400,250));
		applyPanel.setLayout(new GridBagLayout());
		
		// GridBagConstraints gbcApply = new GridBagConstraints();
		
		gbc.insets = new Insets(0,0,0,0);
		gbc.gridy=0;
		gbc.anchor = GridBagConstraints.WEST;
		
		panelTitle = new JLabel("Bewerbung");
		panelTitle.setFont(new Font(panelTitle.getFont().getFamily(), Font.BOLD, 18));
		applyPanel.add(panelTitle, gbc);
		
		gbc.insets = new Insets(10,0,0,0);
		gbc.gridy = 1;
		gbc.anchor = GridBagConstraints.WEST;
		
		applyPanel.add(new JLabel("Datum:"), gbc);
		applyDate = new JTextField(10);
		applyPanel.add(applyDate, gbc);
		
		gbc.insets = new Insets(0,0,0,0);
		gbc.gridy = 2;
		applyPanel.add(new JLabel("Meter:"), gbc);
		applyMeter = new JTextField(2);
		applyPanel.add(applyMeter, gbc);
 
Damit du nicht den Überblick bei den ganzen GridBagConstraints verlierst, solltest du die einzelnen Panels in privaten Methoden zusammenbauen.
Für die linksbündige Ausrichtung und die Ausdehnung von Komponenten fehlen dir die Gewichtungen (weightx/weighty).
Ich habe das alles, zusammen mit einigen anderen Verbesserungen, mal in Code zusammengefasst:

Java:
import java.awt.GridLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Color;
import java.awt.Font;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.BorderFactory;
import javax.swing.UIManager;
import javax.swing.SwingUtilities;

public class MarktApp {

    private JPanel ratingPanel;
    private JTextField marketDate, marketCity, marketComment;
    private JTextField applyDate, applyMeter;


    public void showAddFrame(){

        JFrame window = new JFrame("Markt hinzufügen");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        
        contentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        contentPanel.setBackground(Color.WHITE);

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        contentPanel.add(createMarketPanel(), gbc);

        gbc.gridy = 1;
        gbc.insets = new Insets(10, 0, 10, 0);
        contentPanel.add(createApplyPanel(), gbc);

        gbc.gridy = 2;
        gbc.insets = new Insets(0, 0, 0, 0);
        contentPanel.add(createAnswerPanel(), gbc);

        window.add(new JScrollPane(contentPanel));

        window.setSize(500, 700);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }
    
    private JPanel createMarketPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        
        panel.setPreferredSize(new Dimension(400,150));
        panel.setBackground(new Color(235,235,235));
        panel.setBorder(BorderFactory.createTitledBorder("Markt hinzufügen"));

        gbc.anchor = GridBagConstraints.WEST;
        /*JLabel panelTitle = new JLabel("Markt hinzufügen");
        gbc.insets = new Insets(0,0,0,0);
        panelTitle.getFont().deriveFont(Font.BOLD, 18);
        panel.add(panelTitle, gbc);*/

        /*gbc.insets = new Insets(20,0,0,0);
        separator = new JSeparator(JSeparator.HORIZONTAL);
        separator.setPreferredSize(new Dimension(250,2));
        panel.add(separator, gbc);*/

        gbc.insets = new Insets(0, 20, 0, 0);
        gbc.gridy = 1;
        panel.add(new JLabel("Datum:"), gbc);

        gbc.insets = new Insets(0, 0, 0, 0);
        marketDate = new JTextField(10);
        panel.add(marketDate, gbc);

        //Abstände nach oben und unten ganz einfach an mittigen Labels einstellen
        gbc.insets = new Insets(10, 20, 10, 0);
        gbc.gridy = 2;
        panel.add(new JLabel("Ort:"), gbc);

        marketCity = new JTextField(20);
        gbc.insets = new Insets(0, 0, 0, 20);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        panel.add(marketCity, gbc);

        //Mindestabstand nach rechts einfach am längsten Wort (Labels) einstellen
        gbc.gridy = 3;
        gbc.weightx = 0.0;
        gbc.insets = new Insets(0, 20, 0, 10);
        panel.add(new JLabel("Bemerkung:"), gbc);
        
        gbc.insets = new Insets(0, 0, 0, 20);
        marketComment = new JTextField(20);
        panel.add(marketComment, gbc);
        
        return panel;
    }
    
    private JPanel createApplyPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        
        panel.setPreferredSize(new Dimension(400,150));
        // Hintergrundfarbe: Ivory 2
        panel.setBackground(new Color(224,224,224));
        panel.setBorder(BorderFactory.createTitledBorder("Bewerbung"));

        gbc.anchor = GridBagConstraints.WEST;
        /*JLabel panelTitle = new JLabel("Bewerbung");
        panelTitle.getFont().deriveFont(Font.BOLD, 18);
        panel.add(panelTitle, gbc);*/

        //Mindestabstand nach rechts einfach am längsten Wort (Labels) einstellen
        //Orientierung auch am längsten Label überhaupt
        gbc.insets = new Insets(0, 20, 0, 33);
        gbc.gridy = 1;
        gbc.anchor = GridBagConstraints.WEST;
        panel.add(new JLabel("Datum:"), gbc);
        
        applyDate = new JTextField(10);
        gbc.insets = new Insets(0, 0, 0, 0);
        panel.add(applyDate, gbc);

        //Abstände nach oben und unten ganz einfach an mittigen Labels einstellen
        gbc.insets = new Insets(10, 20, 10, 0);
        gbc.gridy = 2;
        panel.add(new JLabel("Meter:"), gbc);
        
        applyMeter = new JTextField(3);
        gbc.insets = new Insets(0, 0, 0, 0);
        gbc.weightx = 1.0;
        panel.add(applyMeter, gbc);
        
        return panel;
    }
    
    private JPanel createAnswerPanel() {
        JPanel panel = new JPanel();
        panel.setBackground(new Color(235,235,235));
        panel.setPreferredSize(new Dimension(400,300));
        return panel;
    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
            System.err.println(e.toString());
        }
        

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MarktApp marktApp = new MarktApp();
                marktApp.showAddFrame();
            }
        });
    }
}
 

Zurück
Oben