Problem mit JScrollPane in einer JScrollpane

Apfelsinenkern

Aktives Mitglied
Moin, ich melde mich mal wieder, und zwar mit folgendem Problem:

Ich will auf einem JPanel in einer JScrollpane ein weiteres JPanel in einer JScrollpane hinzufügen. Bleibt das JPanel ,,pictureViewer" leer, wird auch kein JScrollpane angezeigt. Füge ich dem Panel beispielsweise ein JLabel mit einem Bild hinzu, wird es angezeigt. Wenn ich aber ein weiteres JLabel ausserhalb der JScrollpane in dem Panel der großen JScrollpane anbringe verschwindet die JScrollpane. (Und ja, ich hab schon daran gedacht, das GridBagLayout so anzupassen, das es wieder sichtbar wird, aber da is nix..)

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.URI;
import java.util.Iterator;
import java.util.Set;

import javax.lang.model.element.Modifier;
import javax.lang.model.element.NestingKind;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.tools.FileObject;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.swing.*;


public class Menu extends JPanel implements ActionListener
   {
	private static final long serialVersionUID = 8976517790344077191L;
	GridBagConstraints constraints = new GridBagConstraints();
    Component c;
    public JScrollPane scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
	public JPanel pictureViewer = new JPanel();
	public JScrollPane picturescroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
	
    public Menu()
	{
	  this.setBackground(new Color(255,168,0));
	  this.setLayout(new GridBagLayout());
	 
	  pictureViewer.setBackground(new Color(55,55,55));
	  picturescroll.setSize(300,300);
	  
	  constraints.gridheight =GridBagConstraints.REMAINDER;
	    constraints.gridwidth = GridBagConstraints.REMAINDER;
	    constraints.anchor = GridBagConstraints.CENTER;
	    constraints.insets = new Insets(300, 0, 0, 0);
	    ImageIcon icon = new ImageIcon(this.getClass().getResource("Menu.png"));
	    c = new JLabel(icon);
	   pictureViewer.add(c, constraints);
	     
	
	 
	    constraints.gridheight =GridBagConstraints.REMAINDER;
	    constraints.gridwidth = GridBagConstraints.REMAINDER;
	    constraints.anchor = GridBagConstraints.CENTER;
	    constraints.insets = new Insets(0, 0, 400, 0);
	    c = picturescroll;
	    add(c, constraints);
	    

	    picturescroll.getViewport().add(pictureViewer);
	 scroll.getViewport().add(this);
	 
	 
	}



	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

	}

}
 
Fügst du eigentlich irgendwo die JScrollPane scroll deinem Layout hinzu? In dem Ausschnitt den du geschickt hast, fügst du nur dein JPanel der JScrollPane hinzu, aber "scroll" wird nicht weiter verwendet.

Ich finde den Aufbau von dem ganzen etwas schief. Z.B. ist es nicht gerade elegant, dass du die beiden JScrollPanes, sowie das interne Panel public hast. Außerdem würde ich die "äußere" JScrollPane dort initialisieren, wo du auch das JPanel "Menu" initialisierst.

Edit: Wieso machst du eigentlich so etwas?:

Java:
    Component c;
    
    c = new JLabel(icon);
    pictureViewer.add(c, constraints);

    c = picturescroll;
    add(c, constraints);
 
Zuletzt bearbeitet:
Jupp, das war falsch, hatte ich gar nicht bemerkt. Aber so, wie der Code jetzt ist, wills noch ned richtig.
Zwar wird beides jetzt angezeigt, jedoch wird das Menü-Pic sehr verschoben.... Trotz aller Hinundherprobiererei hab ichs ned geschafft, es richtig einzustellen. Ebenso lässt das innere JScrollPane sich ned von der Größe her einstellen...


Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class Menu extends JPanel implements ActionListener
   {
	//Muss public sein aufgrund anderer Klasse
	public JScrollPane scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
	
	public JPanel pictureViewer = new JPanel();
	private static final long serialVersionUID = 8976517790344077191L;
	GridBagConstraints constraints = new GridBagConstraints();
	GridBagConstraints sconstraints = new GridBagConstraints();
    Component c;
    Component s;
    
   
	
    public Menu()
	{
      scroll.getViewport().add(this);
      JScrollPane picturescroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
      picturescroll.getViewport().add(pictureViewer);
      this.setBackground(new Color(255,168,0));
	  this.setLayout(new GridBagLayout());
	  
	  pictureViewer.setLayout(new GridBagLayout());
	  pictureViewer.setBackground(new Color(255,255,255));
	  
	 
	  constraints.gridheight =GridBagConstraints.REMAINDER;
	  constraints.gridwidth = GridBagConstraints.REMAINDER;
	  constraints.anchor = GridBagConstraints.CENTER;
	  constraints.insets = new Insets(0, 0, 0, 0);
	  c = picturescroll;
	  add(c, constraints);

	    
	    sconstraints.gridheight =GridBagConstraints.REMAINDER;
	    sconstraints.gridwidth = GridBagConstraints.REMAINDER;
	    sconstraints.anchor = GridBagConstraints.CENTER;
	    sconstraints.insets = new Insets(0, 0, 500, 0);
	    s = new JLabel("Das hier ist ein Test.");
	   pictureViewer.add(s, sconstraints);
	   
	   sconstraints.gridheight =GridBagConstraints.REMAINDER;
	    sconstraints.gridwidth = GridBagConstraints.REMAINDER;
	    sconstraints.anchor = GridBagConstraints.CENTER;
	    sconstraints.insets = new Insets(0, 0, 300, 0);
	    s = new JLabel("Das hier ist ein Test.2");
	   pictureViewer.add(s, sconstraints);
	   
	   
	   constraints.gridheight =GridBagConstraints.REMAINDER;
	   constraints.gridwidth = GridBagConstraints.REMAINDER;
	   constraints.anchor = GridBagConstraints.CENTER;
	   constraints.insets = new Insets(0, 0, 0, 0);
	    ImageIcon icon = new ImageIcon(this.getClass().getResource("Menu.png"));
	    c = new JLabel(icon);
	     add(c, constraints);
	   
	    

	   
	
	 
	 
	}



	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

	}

}
 
Bin gerade zu faul mir ein lauffähiges Programm dazu zu schreiben, aber was auffällt ist, dass du GridBagConstraints.REMAINDER als gridwidth und gridheight benutzt. Schau dir doch mal die Java-Doku dazu an. Da steht bei REMAINDER: "Specifies that this component is the last component in its column or row."

Wie kann diese Konstante also eine Größenangabe darstellen? REMAINDER für die Positionierung zuständig.

Außerdem fügst du die ganzen Komponenten (z.B. die JLabels) immer auf der gleichen Position hinzu. Du solltest vielleicht mal gridx und gridy ändern (siehe GridBagConstraints).

Und die JScrollPane "scroll" muss immer noch nicht public sein, weil du sie auch einfach in der Klasse initialisieren kannst in der du sie gerade aufrufst. Und dort setzt du dann den Viewport auf das JPanel Menu.
 

Zurück
Oben