JPanel in JScrollPane neu zeichnen

Status
Nicht offen für weitere Antworten.

redbomber

Bekanntes Mitglied
Hi zusammen,
mal wieder eine Frage:

Ich habe eine JFrame, in dem sich mehrere JPanels befinden, welche wiederum in eine JScrollane eingebettet sind:

Hier also meine JScrollPane:

Code:
JScrollPane listScroller;
listScroller.getHorizontalScrollBar().addAdjustmentListener(new RepaintPlotAction());
listScroller.getVerticalScrollBar().addAdjustmentListener(new RepaintPlotAction());

ich habe also einen Listener hinzugefügt, welche bemerkt wenn der scrollbalken bewegt wird
Wenn dieses Event gefeuert wird, wird die folgende Methode aufgerufen:

Code:
// listOfPlots ArrayList<Plot> in der sich alle Plots befinden (vom Typ JPanel)
public void updateAllPlots(){
        //MyDraw (extends JPanel)
	for(MyDraw draw: listOfPlots){
			draw.repaint();
	}
}

Jo, aber was passiert nun:
Wenn ich den Scrollbalken bewege, wird das Panel nicht neu gezeichnet, bzw. doch.
Es wird immer auf die alte Zeichnung neu draufgezeichnet, bis irgendwannd das ganze Panel vollgemalt ist.

Aber ich möchte doch einfach nur auf meinem Panel entlang scrollen können.
 

Ebenius

Top Contributor
Die Listener sind unnötig, bzw. falsch. Du machst irgendwas beim Zeichnen in MyDraw falsch. Poste doch mal den Source-Code dieser Klasse.

Ebenius
 

redbomber

Bekanntes Mitglied
was meinst du mit unnötig?
Sollte ich also von meinem JPanel aus mitbekommen, wenn der Scrollbalker der JScrollPane bewegt wird?




Code:
public class MyDraw extends JPanel{
	double miny=Double.MAX_VALUE, minx=Double.MAX_VALUE, maxy=Double.MIN_VALUE,  maxx=Double.MIN_VALUE;   
	protected int height = 200;
	protected int width = 8000;
	protected double yrange, xrange;
	protected ArrayList<Integer> data = new ArrayList<Integer>();
	
	protected double Xscaling=1.0;
	protected double Yscaling=1.0;
	protected double Xshift=0;
	protected double Yshift=0;
	protected Manager manager;
	
	protected AffineTransform orgTf;
	
	protected boolean drawLine = false;
	protected double xLinePos;
	
    /** Creates a new instance of MyDraw */
    public MyDraw(ArrayList<Integer> data, Manager manager) {
    	manager.addPlotToPlotlist(this);
    	this.setBackground(Color.WHITE);
    	this.setSize(width, height);
    	this.setPreferredSize(new Dimension(width, height));
    	this.setOpaque(true);
    	this.data = data;
    	this.setVisible(true);
    	this.manager = manager;
    	
    	this.addMouseListener(new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("mouseClicked");
			}

			@Override
			public void mouseEntered(MouseEvent event) {
				// TODO Auto-generated method stub
				System.out.println("mouseEntered");
				setLineDrawer(true);
				drawTheLine(event.getLocationOnScreen().getX());
				repaintThePlot();
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("mouseExited");
				setLineDrawer(false);
				repaintThePlot();				
			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}
    		
    	});
    	
    	this.addMouseMotionListener(new MouseMotionListener(){

			@Override
			public void mouseDragged(MouseEvent arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseMoved(MouseEvent event) {
				// TODO Auto-generated method stub
				System.out.println("mouseMoved");
				setActualTooltip(event.getPoint());
				drawTheLine(event.getLocationOnScreen().getX());
				repaintThePlot();
			}
    		
    	});
    	
    	setMinMaxValues();

    }

// dies hier am besten garnicht betrachten ;)
    public void paintComponent (Graphics g)
    {
		final Graphics2D g2d = (Graphics2D) g;
		orgTf = g2d.getTransform();
		g2d.setBackground(Color.white);
		g2d.setTransform(orgTf);
		orgTf.translate(5., 5.);
		g2d.setColor(Color.RED);
		g2d.drawLine(0, new Double(miny - 1).intValue(), data.size(),
				new Double(miny - 1).intValue());

		for (int i = 0; i < data.size() - 1; i++) {
			// this.setForeground(Color.RED);
			double rx1 = ((i + 1) - minx) / (maxx - minx);
			double ry1 = (data.get(i + 1) - miny) / (maxy - miny);
			double rx2 = ((i + 1) - minx) / (maxx - minx);
			double ry2 = (data.get(i + 1) - miny) / (maxy - miny);

			int fx1 = (int) (rx1 * getWidth());
			int fy1 = (int) (ry1 * getHeight());
			int fx2 = (int) (rx2 * getWidth());
			int fy2 = (int) (ry2 * getHeight());

			g2d.setColor(Color.GREEN);
			g2d.drawLine(fx1, fy1, fx2, fy2);

		}
		
// hiermit zeichne ich eine vertikale Linie an der Position wo ich mich mit der Maus befinde
		if(drawLine){
			g2d.setColor(Color.CYAN);
			g2d.drawLine((int)xLinePos, 0, (int)xLinePos, getWidth()); 
		}

	}
    
    protected void setMinMaxValues(){	
		minx = 0;
		maxx = data.size()+100;
		
    	for(int i = 1; i < data.size(); i++){
    		miny = miny<data.get(i)?miny:data.get(i);
    		maxy = maxy>data.get(i)?maxy:data.get(i);
    	}
    }
    

    
    protected void setRange(){
    	yrange = maxy - miny; 
    	xrange = maxx - minx;
    	
    	System.out.println("yrange: " +yrange);
    	System.out.println("xrange: "+ xrange);
    }
	
	protected void setActualTooltip(Point point){
		this.setToolTipText("<html><body>xPos "
				+ point.getX() + "
" 
				+ "yPos " + point.getY() + "</body></htlm>");
		
	}
	
	protected void drawTheLine(double xPos){
		xLinePos = xPos;
	}
	
	protected void repaintThePlot(){
		this.repaint();
	}
	
	protected void setLineDrawer(boolean val){
		drawLine = val;
	}
}
 

Ebenius

Top Contributor
paintComponent muss so aussehen:
Code:
public void paintComponent (Graphics g) {
  super.paintComponent(g);
  final Graphics2D g2d = (Graphics2D) g; 
  final AffineTransform orgTf = g2d.getTransform();
  try {
    g2d.translate(5., 5.);
    // YOUR PAINTING HERE!
  } finally {
    // reset old transform
    g2d.setTransform(orgTf); 
  }
}
 

redbomber

Bekanntes Mitglied
Also:

1. der Plot wird jetzt korrekt repainted()
Also wenn ich den Scrollbalken bewege wird der Plot jedes mal neu gezeichnet. Also so wie es sein soll.
Lag also alles meiner falschen paintComponent Methode.


Habe leider aber noch zwei weitere Probleme:
1. Da mein JPanel über die Bildschirmgröße hinaus geht, gibt es ein Problem mit dem Einzeichnen eines senkrechten Strichs an der Mausposition.
Sobald ich den Scrollbalken bewege, zeigt es den strich nicht mehr an.
Vermutlich wird der Strich dann in dem jetzt unsichtbaren Bereich des JPanels gezeichnet.
Siehe hier: hier

2. Und meine Daten werden noch immer falsch herum gezeichnet, obwohl ich die x,y - Werte umgerechnet habe.
Siehe hier: hier
 

Ebenius

Top Contributor
redbomber hat gesagt.:
1. der Plot wird jetzt korrekt repainted()
Also wenn ich den Scrollbalken bewege wird der Plot jedes mal neu gezeichnet. Also so wie es sein soll.
Lag also alles meiner falschen paintComponent Methode.
:wink:

redbomber hat gesagt.:
Habe leider aber noch zwei weitere Probleme:
1. Da mein JPanel über die Bildschirmgröße hinaus geht, gibt es ein Problem mit dem Einzeichnen eines senkrechten Strichs an der Mausposition.
Sobald ich den Scrollbalken bewege, zeigt es den strich nicht mehr an.
Vermutlich wird der Strich dann in dem jetzt unsichtbaren Bereich des JPanels gezeichnet.
Siehe hier: hier
Wahrscheinlich hängt (wie im anderen Thread beschrieben) der MouseMotionListener am falschen Panel. Das erkennt man aber am Code-Ausschnitt nicht.

redbomber hat gesagt.:
2. Und meine Daten werden noch immer falsch herum gezeichnet, obwohl ich die x,y - Werte umgerechnet habe.
Siehe hier: hier
Das erreichst Du mit der scale(double, double)-Methode auf dem Graphics2D. Also ungefähr:
Code:
g2d.scale(1,-1);

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
S JScrollpane mit JPanel und Probleme AWT, Swing, JavaFX & SWT 4
T Swing JPanel in JScrollPane mit maximaler Größe AWT, Swing, JavaFX & SWT 8
R JPanel von JScrollPane entfernen und hinzufügen AWT, Swing, JavaFX & SWT 3
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
K JScrollPane IN JPanel? AWT, Swing, JavaFX & SWT 2
S Swing Problem mit JCheckBox auf JPanel in JScrollPane AWT, Swing, JavaFX & SWT 8
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
X Swing JScrollPane und JPanel AWT, Swing, JavaFX & SWT 3
C JPanel mit FlowLayout in JScrollPane - keinen Scrollbalken AWT, Swing, JavaFX & SWT 2
G Swing JScrollPane auf JPanel AWT, Swing, JavaFX & SWT 3
B JPanel zu groß in JScrollPane AWT, Swing, JavaFX & SWT 5
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3
J Swing JScrollPane fasst JPanel und Groesse des JPanels soll sich aendern AWT, Swing, JavaFX & SWT 2
A Swing Zeilenanzeige: JPanel als Header für JScrollPane AWT, Swing, JavaFX & SWT 7
H Swing Darstellungsproblem JPanel in JPanel in JScrollpane in JSplitPane AWT, Swing, JavaFX & SWT 4
MQue JPanel und JScrollPane AWT, Swing, JavaFX & SWT 8
S JPanel-Dim reicht nicht aus, JScrollPane AWT, Swing, JavaFX & SWT 8
B Anfängerfrage zu Swing (JPanel und JScrollPane) AWT, Swing, JavaFX & SWT 16
J JPanel mit JScrollPane und FlowLayut AWT, Swing, JavaFX & SWT 3
N Mehrere JTextArea in einem JPanel und eine JScrollPane AWT, Swing, JavaFX & SWT 3
C JScrollPane ignoriert JPanel mit überschriebener pai.nt() AWT, Swing, JavaFX & SWT 11
G 2x JPanel im JScrollPane (Hintergrundbild in JScrollPane) AWT, Swing, JavaFX & SWT 9
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
W JPanel in JScrollPane? AWT, Swing, JavaFX & SWT 2
M JPanel JTable in einem JScrollPane AWT, Swing, JavaFX & SWT 6
M JScrollPane im JPanel im JFrame SWING AWT, Swing, JavaFX & SWT 4
S JPanel in JScrollPane AWT, Swing, JavaFX & SWT 11
P JPanel in JScrollPane -> funktioniert nicht(vertikal scro AWT, Swing, JavaFX & SWT 5
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
T Automatische Grössenanpassung JPanel / JScrollpane AWT, Swing, JavaFX & SWT 3
B JPanel in JScrollPane: Probleme mit Scrollleisten AWT, Swing, JavaFX & SWT 13
R JPanel eingebettet in einem JScrollPane AWT, Swing, JavaFX & SWT 3
M JScrollPane auf JPanel - Resizing - Größe verändern AWT, Swing, JavaFX & SWT 10
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
J JPanel in JScrollPane Hilfe bitte AWT, Swing, JavaFX & SWT 2
S JPanel in JScrollPane in der Breite begrenzen AWT, Swing, JavaFX & SWT 3
S Größe von jPanel bzw. jTextArea (in jScrollpane) anpassen AWT, Swing, JavaFX & SWT 1
B Schachtelung von JTable und JScrollpane in JPanel? AWT, Swing, JavaFX & SWT 2
N Probleme mit new JScrollPane(jPanel) AWT, Swing, JavaFX & SWT 6
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben