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.
Hier die Klasse (innere Klasse) fürs Zeichnen:
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:
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);
}
}
}