Seltsames Scroll-Problem

  • Themenstarter Themenstarter onmi
  • Beginndatum Beginndatum
O

onmi

Gast
Hallo,

ich versuche in ein Panel in ein Frame zu bekommen, auf welchem gezeichnet werden kann.
Das Panel soll sich in der Mitte des Fensters befinden und scrollbar sein.

Ich denk jeder der sich das Programm ansieht wird auch sofort mein Problem erkennen.
Die Fläche innerhalb des Panels überdeckt beim Scrollen Teile des Frames...

Java:
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class MainPanel extends JPanel {
	MainPanel() {
		this.setLayout(new BorderLayout(10,10));
		JPanel east = new JPanel();
		JPanel west = new JPanel();
		JPanel north = new JPanel();
		JPanel south = new JPanel();
		east.setBackground(new Color(244,20,0));
		west.setBackground(new Color(0,255,0));
		north.setBackground(new Color(0,0,255));
		south.setBackground(new Color(244,255,0));
		east.setPreferredSize(new Dimension(200,100));
		west.setPreferredSize(new Dimension(200,100));
		north.setPreferredSize(new Dimension(100,30));
		south.setPreferredSize(new Dimension(100,50));
		add(east,BorderLayout.EAST);
		add(west,BorderLayout.WEST);
		add(north,BorderLayout.NORTH);
		add(south,BorderLayout.SOUTH);
		

		Canvas centerc = new Canvas();
		centerc.setSize(1000, 1000);
		centerc.setBackground(new Color(255,255,255));
		JPanel center = new JPanel();
		center.add(centerc);
		JScrollPane centerscroll = new JScrollPane(centerc);
		
		add(centerscroll,BorderLayout.CENTER);
	}
}

Hat jemand einen Lösungsvorschlag?
 
jepp, definitiv ein -für mich- unerwartetes Verhalten.
Als Lösungsvorschlag lässt du den Canvas-Kram weg...und nimmst an dessen eine Klasse MyPanel die JPanel erweitert und zeichnest dann in der paintComponent-Methode, die du überschreiben musst.
 
Aus zum Beispiel solch einem Grund sollte man niemals AWT und Swing vermischen.
Ersetz das Canvas durch ein JPanel.

EDIT:
zusätzlich noch:
Java:
centerc.setSize(1000, 1000);
=>
Java:
centerc.setPreferredSize(new Dimension(1000, 1000));
 
Punkt 1: verzichte auf die Mischung von Swing und AWT. Das Canvas muss also ersatzlos weg.
Punkt 2: du zeichnest jetzt in einem JPanel, bspw. in dein center-Panel oder eine Klasse die von JPanel erbt und die du in deinem MainPanel instanziierst.
Punkt 3: Die JScrollPane bekommt dann dein Zeichenpanel und gehört dann in den Center-Bereich des BorderLayouts.
 
Hab zufällig noch heute gelesen, dass zuerst die Swing- und dann die AWT-Komponenten gezeichnet werden.
Es kommt dann häufig vor, dass Swing-Komponenten überzeichnet werden. Z.B. könnte es auch sein, dass die Menüs
hinter den AWT-Komponenten liegen.

Wenn es geht also am Besten, wie schon beschrieben, AWT und Swing nicht mischen.

VG ROlf
 
Danke für die Antworten!

Hab garnicht bedacht dass Canvas zu AWT Gehört.

Das Problem wenn ich es mit JPanel auswechsel ist nur:
Wie kann ich die "Fläche" so vergrößern, dass Scrollbalken auftauchen, obwohl keine JComponents drinnen sind?
Beispielsweise eine fixe 1000x1000 Fläche oder eine, die beim Scrollen größer wird (s. MS Excel etc.)

Java:
		JPanel center = new JPanel();
		center.setSize(new Dimension(1000, 1000));
		center.setBackground(new Color(255,255,255));
		JScrollPane centerscroll = new JScrollPane(center,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
 
so, wie du es die ganze Zeit vorher gemacht hast...mit [c]setPreferedSize(Dimension dim)[/c]

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

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

public class MainPanel extends JPanel {
	MainPanel() {
		this.setLayout(new BorderLayout(10, 10));
		JPanel east = new JPanel();
		JPanel west = new JPanel();
		JPanel north = new JPanel();
		JPanel south = new JPanel();
		east.setBackground(new Color(244, 20, 0));
		west.setBackground(new Color(0, 255, 0));
		north.setBackground(new Color(0, 0, 255));
		south.setBackground(new Color(244, 255, 0));
		east.setPreferredSize(new Dimension(200, 100));
		west.setPreferredSize(new Dimension(200, 100));
		north.setPreferredSize(new Dimension(100, 30));
		south.setPreferredSize(new Dimension(100, 50));
		add(east, BorderLayout.EAST);
		add(west, BorderLayout.WEST);
		add(north, BorderLayout.NORTH);
		add(south, BorderLayout.SOUTH);

		JPanel center = new JPanel();
		center.setPreferredSize(new Dimension(1000, 1000));
//		center.add(new JLabel("Test"));
		JScrollPane centerscroll = new JScrollPane(center);

		add(centerscroll, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.add(new MainPanel());
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(888, 888);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}

}
 

Zurück
Oben