JScrollPane mit JPanel als ViewPort -> setPreferredSize

T

ToMeFox

Hallo zusammen und erstmal danke fürs lesen ;)

Ich habe diesen Post schoneinmal an anderer Stelle versucht. Ich habe ein recht umfangreiche Klassenhierarchie... aber ich scheitere an einem einfachen Problem :( Ich habe hier ein vereinfaches Beispiel verwendet, dass hoffentlich mein Problem erkennen lässt!

Ich habe ein JPanel auf das ich zeichne. Ich habe ein JSlider mit dem ich dieses Panel vergrößern möchte. Dieses JPanel ist in einer JScrollPane. Das JPanel wird neu gezeichnet und die neue PreferredSize wird auch übernommen. Aber die Größe des Panels ändert sich erst, wenn ich das JFrame mit der Maus vergrößere oder verkleinere?! Was muss ich noch tun

Hoffentlich könnt ihr mir da helfen?

Code:
package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class EinFenster extends JFrame implements ChangeListener
{
	private JSlider zoomSlider;

	private JScrollPane dasScrollPanel;

	private JPanel einPanel;

	public EinFenster()
	{
		super("Ein Test");
		super.setSize(400, 400);
		super.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

		this.zoomSlider = new JSlider(500, 2000);
		this.zoomSlider.addChangeListener(this);

		this.einPanel = new JPanel()
		{
			public void paintComponent(Graphics g)
			{
				super.paintComponent(g);
				// Hier versuche ich die neue Größe festzulegen!
				super.setPreferredSize(new Dimension(zoomSlider.getValue(),
						zoomSlider.getValue()));

				/*
				 * ... Hier Zeichne ich die Grafik .... Bsp.
				 */
				g.setColor(Color.WHITE);
				for (int i = 0; i < 150; i++)
					g.drawString("Hallo " + i, 20, (i + 1) * 40);
			}
		};
		this.einPanel.setBackground(Color.GRAY);
		this.einPanel.setPreferredSize(new Dimension(zoomSlider.getValue(),
				zoomSlider.getValue()));

		this.dasScrollPanel = new JScrollPane(
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		this.dasScrollPanel.setViewportView(this.einPanel);

		super.getContentPane().add(this.zoomSlider, BorderLayout.NORTH);
		super.getContentPane().add(this.dasScrollPanel, BorderLayout.CENTER);
	}

	public void revalidateScrollPane()
	{
		this.dasScrollPanel.repaint();
	}

	public static void main(String[] args)
	{
		new EinFenster().setVisible(true);
	}

	/*
	 * Wenn das Slider seinen Wert ändert, soll das Panel in der Größe sich dem
	 * Wert anpassen (sie paint(..))
	 */
	public void stateChanged(ChangeEvent e)
	{
		this.einPanel.repaint();
	}

}
 
Hallo,

repaint reicht in dem Fall nicht aus, da es nur die Komponente neu zeichnen lässt.

versuchs mal mit:
revalidate() oder updateUI()


Vg Erdal
 
Mensch... danke!

Das revalidate() hatte auch nicht funktioniert. Ich hatte sogar die Methoden des LayoutManager angehauen. Aber auf sowas einfaches wie updateUI bin ich nicht gekommen! Das wars! Das hat geholfen.

Besten Dank! :)
 

Neue Beiträge

Zurück