JScrollPane überdeckt JPanel?

Rarzhn

Mitglied
Hallo, ich bin leider noch ein relativer Anfänger in Java und bastle gerade ein kleines Programm bei dem ich vor einem Problem stehe:

Ich habe ein Fenster mit 2 JPanels und möchte, wenn ich das Fenster kleiner ziehe als eines JPanel ist,
dass dieses mit einem JScrollpane ausgestattet wird um das gesamte Panel verfügbar machen zu können. Normalerweise hat das Panel eine braune Farbe Wenn ich das JScrollPane einfüge, scheint es so, als ob dieses das komplette Panel überdeckt, da das Panel grau ist (Schaltflächenfarbe). Ich weiss gerade leider nicht, wo der Fehler liegt und habe auch im Internet keine passenden Hinweise gefunden :/ Evtl suche ich auch einfach nach den falschen Stichworten 😀
Ich habe hier einmal folgenden Code

Java:
...
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
panelZeichnen = new JPanel();
panelZeichnen.setBackground(new Color(255, 250, 205));
panelZeichnen.setBounds(0, 0, 800, 800);
contentPane.add(panelZeichnen);
panelZeichnen.setLayout(new BorderLayout(0, 0));
		
scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
panelZeichnen.add(scrollPane, BorderLayout.CENTER);
...

Bestimmt nur ein blöder Fehler, den ich durch meinen Tunnelblick aber gerade einfach nicht finde ~~
Kann mir jemand helfen?
Lg
 
Zuletzt bearbeitet:
hast du die ScrollPane visible gesetzte?

Java:
 JScrollPane jsp = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jsp.setViewportView( panel); //Panel an ScrollPane übergeben
        frame.getContentPane().add( jsp); //ScrollPane, dass das Panel hält an Frame übergeben
        jsp.setVisible(true); //ScrollPane sichtbar machen
 
Zuletzt bearbeitet:
leider hat mich das nicht wirklich weiter gebracht.
Ich habe mehrere Varianten probiert (auch unter Beherzigung des Links) aber habe nach wie vor das gleiche Problem...
Sobald ich das ScrollPane einbinde, wird das gesamte Panel grau, als ob es überdeckt sein würde.
Lässt sich eventuell über einen Messenger, o.ä. Kontakt mit jemandem herstellen, der mir da helfen kann?
Ich scheine da die grundsätzliche Funktionsweise des ScrollPanes nicht ganz zu verstehen :/

Lg
 
Java:
public class SwingGUI extends JFrame {

	private JPanel contentPane;
	private JPanel panelZeichnen, panelFunktion;
	private JScrollPane scrollPane;
        ....


	public SwingGUI() {
		
		super("Test");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Toolkit.getDefaultToolkit().setDynamicLayout(true);
		setBounds(100, 100, 1150, 827);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		panelZeichnen = new JPanel();
		panelZeichnen.setBackground(new Color(255, 250, 205));
		panelZeichnen.setBounds(0, 0, 800, 800);
		contentPane.add(panelZeichnen);
		panelZeichnen.setLayout(new BorderLayout(0, 0));
		
		/*scrollPane = new JScrollPane(panelZeichnen);
		scrollPane.setPreferredSize(new Dimension (10, 10));
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
		add(scrollPane, BorderLayout.CENTER);
		scrollPane.setVisible(true);*/     // ScrollPane habe ich derzeit auskommentiert um weiter arbeiten zu können..
		
		panelFunktion = new JPanel();
		panelFunktion.setBounds(810, 0, 331, 562);
		contentPane.add(panelFunktion);
		GridBagLayout gbl_panelFunktion = new GridBagLayout();
		gbl_panelFunktion.columnWidths = new int[] {50, 30, 50, 30, 7, 50, 0, 0};
		gbl_panelFunktion.rowHeights = new int[]{23, 23, 86, 14, 23, 23, 58, 23, 20, 84, 23, 53, 23, 0};
		gbl_panelFunktion.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		gbl_panelFunktion.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		panelFunktion.setLayout(gbl_panelFunktion);
		
		//...hier zwischen werden in panelFunktion ein Haufen Buttons, Textboxes, etc hinzugefügt. Habe ich der Übersicht halber heraus genommen, da diese ja nichts mit dem panelZeichnen zu tun haben..

		panelFunktion.setVisible(true);
		panelZeichnen.setVisible(true);

So sieht die initialisierung des Fensters und der Panels derzeit aus 🙂 Habe mir das ganze auch mit WindowBuilder angesehen und dort kann man tatsächlich auch sehen, dass, sobald ich das ScrollPane in das Panel einfüge, das Feld komplett mit dem ScrollPane scheinbar überdeckt wird.
Hoffe, das hilft ein wenig ><
 
Ich glaube du verstehst noch nicht ganz, wie das mit den JScrollPanes funktioniert. Dein JPanel muss die View des JScollPanes sein, das heisst dein JPanel ist im JScrollPane. Du kannst kein JPanel mit einem JScrollPane ausstatten, sondern das JPanel muss im JScrollPane sein. Du kannst dir das JScrollPane vorstellen wie ein JPanel, welches ScrollBars erhält, wenn der Inhalt grösser als das JScrollPane selbst wird. Schau vielleicht doch nochmals in den Link von Harry Kane.
 
@Rarzhn: Bei deinem letzten Codebeispiel fügst du JScrollPane direkt dem JFrame hinzu, und keinem der panels. Warum dies? Letztlich sollte das nix ausmachen, denn JFrame.add(Component c) ist meines Wissens nach nur ein Shortcut für JFrame.getContentPane().add(Component c), so daß die JScrollPane eigentlich wieder auf dem contentPane landen sollte. Da du die bounds von der JScrollPane nicht setzt, und contentPane ein Null-Layout hat, dürfte eigentlich gar nix zu sehen sein. Das heisst, dein panelZeichnen wird wahrscheinlich gar nicht von der JScrollPane verdeckt, sondern geht zusammen mit der unsichtbaren JScrollPane unter. Dein panelZeichnen hat scheinbar auch keine preferredSize, worauf dei JScrollPane schauen könnte. Das setzen der bounds reicht offenbar nicht aus, damit die JScrollPane wissen kann, wieviel Platz sie für das panelZeichnen zur verfügung stellen soll.
Hier ist ein kurzes Beispiel, wie man eine JScrollPane nutzen kann:
Java:
public class ScrollPaneDemo {
    
    public static void main(String[] args){
        JFrame main = new JFrame();
        JScrollPane centerPane = new JScrollPane(new ColorArea(new Dimension(800, 400), Color.red));
        main.getContentPane().add(centerPane);
        JScrollPane leftPane = new JScrollPane(new ColorArea(new Dimension(200, 600), Color.blue));
        main.getContentPane().add(leftPane, BorderLayout.WEST);
        main.pack();
        main.setVisible(true);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    static class ColorArea extends JComponent{
        private Color color;
        public ColorArea(Dimension size, Color color){
            this. color = color;
            setPreferredSize(size);
        }
        public void paintComponent(Graphics g){
            g.setColor(color);
            g.fillRect(0, 0, super.getPreferredSize().width, super.getPreferredSize().height);
        }
    }
}
 

Neue Themen


Zurück
Oben