Seltsamer Effekt bei repaint()

Status
Nicht offen für weitere Antworten.
T

Tomtom

Gast
Hallo,

ich zeichne in einem JDesktopPane ein beliebiges Objekt, zB ein Rechteckt. Das Zeichnen findet in einer eigenen Klasse statt, die dem JDesktopPane hinzugefügt wird. Es wird alles problemlos gezeichnet, dort wo es auch hin soll. Per MouseListern soll aber bei jedem Klick das Rechteck dort neu erscheinen, wo ich mit der Maus hingeklickt habe.

Code:
.........
	//initialisiert visibleBeanPane
	private JDesktopPane getVisibleBeanPane() {
		if (visibleBeanPane == null) {
			visibleBeanPane = new JDesktopPane();
			visibleBeanPane.setBounds(60,60,frx,fry);
			visibleBeanPane.add(vis_layer);
			visibleBeanPane.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
				public void mouseMoved(java.awt.event.MouseEvent e) {    
				}
			});
			visibleBeanPane.addMouseListener(new java.awt.event.MouseAdapter() {   
				public void mouseClicked(java.awt.event.MouseEvent e) {

					int mx = e.getX();
					int my = e.getY();
					
					int x = vis_layer.getX();
					int y = vis_layer.getY();
					int h = vis_layer.getH();
					int w = vis_layer.getW();
					System.out.println("bekomme "+x+" "+y+" "+h+" "+w);
					if (mx>=x && mx<=w && my>=y && my<=h) {
						System.out.println("drin");
					}
					vis_layer.setXYHW(mx,my,h,w);System.out.println("sende "+mx+" "+my+" "+h+" "+w);

				}
			});
			vis_layer.setBounds(0,0,frx,fry);
		}
		return visibleBeanPane;
	}
.........

Hier die Klasse (innere Klasse) fürs Zeichnen:


Code:
	class VisDrawLayer extends JComponent{
		
		private int x=0;
		private int y=0;
		private int h=20;
		private int w=20;
		
		public VisDrawLayer() {
	       	//Loader l = new Loader();
	       	//l.methodenlesen("D:\\FirstBean.jar");
		}
		public void setXYHW(int x,int y,int h,int w) {
			this.x=x;
			this.y=y;
			this.h=h;
			this.w=w;
			repaint();
		}
		public int getX() {
			return x;
		}
		public int getY() {
			return y;
		}
		public int getH() {
			return h;
		}
		public int getW() {
			return w;
		}
		public void paintComponent (Graphics g) {
			System.out.println("-> zeichne "+x+" "+y+" "+h+" "+w);
			g.drawRect(x,y,h,w);
		}
	}

Und jetzt kommts: wenn ich die Maus an beliebiger Stelle im Pane klicke, wird das Rechteck immer an den doppelten Wert der X-Y Koordinaten gezeichnet, obwohl an die zeichen-Klasse die korrekten Werte übergeben werden?

Ich dachte schon, es könnte daran liegen, das Swing und AWT evtl gemischt sind, das sollte ja des öfteren zu Problemem führen, aber ohne "java.AWT.Graphics" kann ich doch nicht zeichnen, oder? Woran könnte es nocht liegen, offentsichtlich ist es keine Problem des "Werteübergebens".

Ich hab WinXP, JRE 1.5.0_03, Eclipse 3.0.1

Hier nochmal der gesamte Quelltext:

Code:
package beacon;

import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.Color;
import java.awt.dnd.*;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.*;
import java.awt.Graphics;


import javax.swing.JDesktopPane;

public class Project extends JFrame {

	private javax.swing.JPanel jContentPane = null;
	private int frx;
	private int fry;
	private String title;
	private Color back;
	private Point p = new Point(0,0);
		
	private VisDrawLayer vis_layer = new VisDrawLayer();
	private InvisDrawLayer invis_layer = new InvisDrawLayer();
	private ConDrawGlassPane glass_layer = new ConDrawGlassPane();

	private JDesktopPane invisibleBeanPane = null;
	private JDesktopPane visibleBeanPane = null;

	//Standartkonstruktor
    public Project(int frx, int fry,String title, Color back) {
		super();
		this.frx = frx;
		this.fry = fry;
		this.title = title;
		this.back = back;
		initialize();
	}
    
    //this initialisieren
	private void initialize() {
		//wenn randdicke geändert werden soll: rechts/unten immer doppelt soviel + || - wie oben/links
		this.setSize(frx+128,fry+154);
		this.setBounds((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width)/2-((frx+128)/2),(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height)/2-((fry+154)/2),frx+128,fry+154);
		this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/res/beangrey.gif")));
		this.setContentPane(getJContentPane());
		this.setTitle(title);

		this.setGlassPane(glass_layer);
		this.getGlassPane().setVisible(true); 
		
		DropTargetListener dropTargetListener = new DropTargetListener() {

			  // Die Maus betritt die Komponente mit einem Objekt
			  public void dragEnter(DropTargetDragEvent e) {
				//System.out.println("drin");
			  }
			  
			  // Die Komponente wird verlassen 
			  public void dragExit(DropTargetEvent e) {}
			  
			  // Die Maus bewegt sich über die Komponente
			  public void dragOver(DropTargetDragEvent e) {}
			  
			  public void drop(DropTargetDropEvent e) {
			  	p = e.getLocation();
			  	Transferable tr = e.getTransferable();
			  	DataFlavor[] flavors = tr.getTransferDataFlavors();
			  	Object data = new Object();
			  	try {
				         e.acceptDrop (e.getDropAction());
				         data = tr.getTransferData(flavors[0]);
				         e.dropComplete(true);
		         
			  	} catch (Exception ex) { System.out.println(ex);}
			  	System.out.println("Drop-Punkt: "+p+" Name: "+data);	
			  }
			  
			  public void dropActionChanged(DropTargetDragEvent e) {}
		};
		
		jContentPane.setDropTarget(new DropTarget(jContentPane,dropTargetListener));
	}
	
	//initialisiert jContentPane
	private javax.swing.JPanel getJContentPane() {
		if(jContentPane == null) {
			jContentPane = new javax.swing.JPanel();
			jContentPane.setLayout(null);
			jContentPane.setBackground(new java.awt.Color(238,238,238));
			jContentPane.add(getInvisibleBeanPane(), null);
		}
		return jContentPane;
	}

	//initialisiert invisibleBeanPane	 
	private JDesktopPane getInvisibleBeanPane() {
		if (invisibleBeanPane == null) {
			invisibleBeanPane = new JDesktopPane();
			invisibleBeanPane.setLayout(null);
			invisibleBeanPane.setBounds(0, 0, frx+128,fry+154);
			invisibleBeanPane.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
			invisibleBeanPane.setBackground(new java.awt.Color(238,238,238));
			invisibleBeanPane.add(getVisibleBeanPane(), null);
			invisibleBeanPane.add(invis_layer);
			invis_layer.setBounds(0,0,frx+128,fry+154);
		}
		return invisibleBeanPane;
	}

	//initialisiert visibleBeanPane
	private JDesktopPane getVisibleBeanPane() {
		if (visibleBeanPane == null) {
			visibleBeanPane = new JDesktopPane();
			visibleBeanPane.setBounds(60,60,frx,fry);
			visibleBeanPane.add(vis_layer);
			visibleBeanPane.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
				public void mouseMoved(java.awt.event.MouseEvent e) {    
				}
			});
			visibleBeanPane.addMouseListener(new java.awt.event.MouseAdapter() {   
				public void mouseClicked(java.awt.event.MouseEvent e) {

					int mx = e.getX();
					int my = e.getY();
					
					int x = vis_layer.getX();
					int y = vis_layer.getY();
					int h = vis_layer.getH();
					int w = vis_layer.getW();
					System.out.println("bekomme "+x+" "+y+" "+h+" "+w);
					if (mx>=x && mx<=w && my>=y && my<=h) {
						System.out.println("drin");
					}
					vis_layer.setXYHW(mx,my,h,w);System.out.println("sende "+mx+" "+my+" "+h+" "+w);

				}
			});
			vis_layer.setBounds(0,0,frx,fry);
		}
		return visibleBeanPane;
	}
	
	class VisDrawLayer extends JComponent{
		
		private int x=0;
		private int y=0;
		private int h=20;
		private int w=20;
		
		public VisDrawLayer() {
	       	//Loader l = new Loader();
	       	//l.methodenlesen("D:\\FirstBean.jar");
		}
		public void setXYHW(int x,int y,int h,int w) {
			this.x=x;
			this.y=y;
			this.h=h;
			this.w=w;
			repaint();
		}
		public int getX() {
			return x;
		}
		public int getY() {
			return y;
		}
		public int getH() {
			return h;
		}
		public int getW() {
			return w;
		}
		public void paintComponent (Graphics g) {
			System.out.println("-> zeichne "+x+" "+y+" "+h+" "+w);
			g.drawRect(x,y,h,w);
		}
	}

	class InvisDrawLayer extends JComponent{
		
		public void paintComponent (Graphics g) {
			//g.drawRect(1,1,33,33);
		}
	}

	class ConDrawGlassPane extends JComponent{
		
		public void paintComponent (Graphics g) {
			//g.drawRect(10,10,318,238);
		}
	}
}
 
T

Tomtom

Gast
Hab gerausgefunden, das man den "Bug" durch die Zeile

Code:
g.drawRect(x-x,y-y,h,w);

umgehen kann, aber das kann doch eigentlich keine Lösung sein....
...und es ist auch komisch, warum (x-x) und (y-y) nicht null ergibt, sondern den MauszeigerX-Y-Wert, den der Listener ausspuckt.

???:L
 

Wildcard

Top Contributor
Das gibt schon 0, deshalb kannst du da auch 0 reinschreiben
Der Trick ist jede JComponent hat ihr eigenes Koordinatensystem.
Das sind also immer Relativ-Werte :wink:
 
G

Guest

Gast
Ist mit aber doch erstmal sehr suspekt, wenn ich zB rein in einem Canvas arbeite, funktioniert die Methodik, so wie ich es mir dachte, hm nagut, ich denk nochmal drüber nach und dank dir für deinen Input :toll:
 

Wildcard

Top Contributor
Ich hab mich jetzt nicht weiter in deinen Code eingelesen, aber in diesem Punkt unterscheiden sich AWT und Swing nicht.
Jede Komponente hat ein Koordinatensystem.
(0,0) ist bei einem JFrame eben die linke-obere Ecke egal wo der Frame auf dem Bildschirm liegt.
Genauso verhalten sich die einzelnen Komponenten zum Frame.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java-Anwendung arbeitet Programm in seltsamer Reihenfolge ab AWT, Swing, JavaFX & SWT 3
J Java-Beryl-Bug mit seltsamer Ausprägung AWT, Swing, JavaFX & SWT 7
D Seltsamer Rahmen bei JCheckBox AWT, Swing, JavaFX & SWT 7
I JavaFX Hover-Effekt bei Button AWT, Swing, JavaFX & SWT 11
I JavaFX: "Hover" und "Transition"-Effekt onEntered/onExited AWT, Swing, JavaFX & SWT 0
L JavaFX Hover Effekt über das Parent Element AWT, Swing, JavaFX & SWT 4
J Teiltransparenter JFrame mit Blur-Effekt AWT, Swing, JavaFX & SWT 2
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
G JavaFX Button gedrückt "Effekt" AWT, Swing, JavaFX & SWT 2
E Problem mit Mouseover-Effekt AWT, Swing, JavaFX & SWT 2
A LookAndFeel Rollover Effekt bei JTabbedPane deaktivieren (Nimbus) AWT, Swing, JavaFX & SWT 8
E Swing Tutorial Buch blättern Effekt gesucht AWT, Swing, JavaFX & SWT 2
Dit_ Buttons Mouse-Over Effekt AWT, Swing, JavaFX & SWT 8
S Komischer Effekt bei Laf AWT, Swing, JavaFX & SWT 6
V Mouseover-Effekt bei JButton abschalten? AWT, Swing, JavaFX & SWT 2
K L a y o u t-Testprogramm mit seltsamen Effekt AWT, Swing, JavaFX & SWT 7
R Wie geht dieser Effekt? AWT, Swing, JavaFX & SWT 15
C 3D-Effekt bei Buttons AWT, Swing, JavaFX & SWT 3
foobar 3D-Effekt AWT, Swing, JavaFX & SWT 3
R JTextField - setBackground - kein Effekt AWT, Swing, JavaFX & SWT 5
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben