wieder mal ein prob mit dnd

Status
Nicht offen für weitere Antworten.

xeon

Mitglied
hi @ all!

ich hab da n kleines problem.
hab mich auch durch die forensuche und google gekämpft und annährend brauchbare sachen
gefunden, die ich allerdings doch nicht verwenden kann... 🙁

also - ich schreibe gerade eine kleine anwendung bei der ein template eingelesen wird
und somit eine dynamische anzahl an hosts in meine klasse Hosts geschrieben wird.
zusätzlich dazu gibbets auch noch x,y - koordinaten und n gif zu laden.

jedes objekt, also jeder host, ist bei mir durch ein extra panel dargestellt, das das gif und
eine description beinhaltet. diese einzelnen panels liegen wiederum auf einem panel, welches
meine frame ausfüllt.

jetzt würde ich gerne per gedrückter maustaste die einzelnen panels auf meinem main-panel
verschieben, kriegs aber leider nich hin.

I'am a real gui-noob 🙁

wär nett, wenn einer helfen kann.

greetz! xeon
 
Es würde helfen wenn du sagst wo du konkret Probleme hast.
Mit Panels ist das allerdings etwas ungünstig, weil es seltsam aussieht wenn man Panels übereinander schiebt.
Vieleicht sind JInternalFrames die bessere Wahl...
 
also ich schreibe das halt ausschließlich unter awt...

ich denk ich könnt auch labels nehmen!? ???:L

mein problem liegt darin, dass ich keinen ansatz finde...

Hier initialisere ich ArrayLists für die jeweiligen Typen. (Host = list)
hab ich am anfang etwas ungünstig gewählt... 😉

Code:
public class MainPanel extends Panel

        ArrayList list;
	ArrayList hostGList;
	ArrayList serviceList;
	ArrayList serviceGList;
	Host h;
	HostGroup hgl;
	Service se;
	ServiceGroup sgl;

        public MainPanel() {
		
		setLayout(new BorderLayout());
		setBackground(Color.WHITE);
		
		list = new ArrayList();
		hostGList = new ArrayList();
		serviceList = new ArrayList();
		serviceGList = new ArrayList();

        }

                ....
                ....
                ....

        //Hier werden die Panels angelegt
	public void drawIt() {
		
		for(int i = 0; i < list.size(); ++i)
			super.add((Host)list.get(i));
		
		for(int i = 0; i < hostGList.size(); ++i)
			super.add((HostGroup)hostGList.get(i));
		
		for(int i = 0; i < serviceList.size(); ++i)
			super.add((Service)serviceList.get(i));
		
		for(int i = 0; i < serviceGList.size(); ++i)
			super.add((ServiceGroup)serviceGList.get(i));
		
	}

        //Hier steht dann mein einlesestrom..
        //und dann äqivalent zu den anderen objekten von mir:
        list.add(new Host(hostname, img, pos_X, pos_Y));

}

dann habe ich hier meine Klasse Host, sehen alle fast gleich aus...

Code:
public class Host extends Panel {
	
	String hostname;
	Image img;
	int pos_x;
	int pos_y;
	
	public Host(String host, Image i, int x, int y) {
		
		img = i;
		hostname = host;
		pos_x = x;
		pos_y = y;
		
		this.setBounds(x,y,175,36);
		
	}

    public void paint(Graphics g) {
		
		if(img != null)
			g.drawImage(img, 0, 0, this);
				
		g.drawString(hostname, 25, 14);
	}
	
}
[/code]
 
Generell kannst du das mit einem MouseMotionListener machen. Die Frage ist halt wie das 'verschieben' dann später aussehen soll?
Gibts einen Grund warum du AWT benutzt?
 
also swing hat mich generell etwas abgeschreckt, weil selbst die paint(..) bzw. paintComponent(..) bei mir mein panel sehr verunstaltet hat. quasi wurde das fenster angezeigt, was hinter dem panel lag - firefox z.b. 😉

deswegen hatte ich erstma auf awt umgestellt, wo's dann auch problemlos ging.
wollte es evtl später wieder über swing laufen lassen. - jetzt allerdings glaube ich, dass ich vllt einfach nochmal gucken
sollte, warum dies alles nicht so richtig geklappt hat und es vllt doch schon früher mache. :mrgreen:

vielen dank erstma für deine antwort.

denke, ich werde es auch über nen FocusListener und MouseMotionListener laufen lassen.

hast du ne ahnung, woran das liegen könnte, dass meine paint(..) unter swing so verrück gespielt hat? hats die probs schon öfter bei anderen leutz gegeben?

greetz! xeon
 
1. in Swing nur paintComponent überschreiben
2. super.paintComponent aufrufen
3. kein AWT in Swing einbauen
dann klappts auch :wink:
 
sooo wildcard, :-D

hab mir jetzt alles in swing umgebaut und mich einige zeit mit JScrollPane rumärgern müssen,
aber jetzt funktioniert soweit alles.

nun kommt allerdings wieder das dnd ins spiel.

hab soweit schon mal erreicht, dass er mir nen host neu platziert, wenn ich ihn verschiebe.
problem, er platziert ihn anscheinend recht willkürlich und auch nur 1 mal. dann wars das...

vllt hast du oder jemand anders hier ja noch ne idee?

meine hosts:

Code:
public class Host extends JLabel {
	
	String hostname;
	Image img;
	int pos_x;
	int pos_y;
	boolean focus = false;
	
	public Host(String host, Image i, int x, int y) {
		
		img = i;
		hostname = host;
		pos_x = x;
		pos_y = y;
		
		setBounds(x,y,175,36);
		
		addMouseMotionListener(new MouseMotionAdapter() {
			
			Host tmp;
			
			public void mouseMoved(MouseEvent me) {
				
				System.out.println("X: " + me.getX() + "\tY: " + me.getY());
				tmp.pos_x = me.getX();
				tmp.pos_y = me.getY();
				
			}
			
			public void mouseDragged(MouseEvent me) {
				
				System.out.println(me.getSource());
				System.out.println("PRESSED");
				
				tmp = (Host)me.getSource();
				
			}
			
		});
				
	}
.......
.......

und das panel:

Code:
public MainPanel() {
		
		setBackground(Color.WHITE);
		setSize(500,500);
		
		list = new ArrayList();
		hostGList = new ArrayList();
		serviceList = new ArrayList();
		serviceGList = new ArrayList();
		
		addMouseListener(new MouseAdapter() {
			
			public void mousePressed(MouseEvent me) { }
			
			public void mouseReleased(MouseEvent me) {
				
				drawIt();
				
			}
			
		});
	
	}
	
	public Dimension getPreferredSize() {
	
		return new Dimension(super.getWidth(), super.getHeight());
		
	}
	
	public void drawIt() {
		
		for(int i = 0; i < list.size(); ++i)
			super.add((Host)list.get(i));
		
		for(int i = 0; i < hostGList.size(); ++i)
			super.add((HostGroup)hostGList.get(i));
		
		for(int i = 0; i < serviceList.size(); ++i)
			super.add((Service)serviceList.get(i));
		
		for(int i = 0; i < serviceGList.size(); ++i)
			super.add((ServiceGroup)serviceGList.get(i));
		
	}
......
.....
...

geh ich da zumindest schon ma richtig ran? - bzw. hat jemand ne idee, wie ich die labels besser (richtig) verschieben kann?

vllt so, dass ich den positionsunterschied bereits während des verschiebens sehe!? 😉

greetz! xeon
 
Code:
   public void drawIt() {
      
      for(int i = 0; i < list.size(); ++i)
         super.add((Host)list.get(i));
Was soll denn das? Du willst die Labels doch verschieben und nicht jedes mal adden?
Ich Frag nochmal, warum keine JInternalFrames? Das sieht doch viel sauberer aus...
 
haste halt vollkommen recht - und JInternalFrame hab ich jetz auch eingebunden. is wirklich einfacher.

nur: macht es einen unterschied, wenn ich die anstatt aufn desktop, in nen panel einbinde?

weil: wenn ich jetz eine verschiebe, bleibt auf der stelle noch eine - kann ich unendlich oft machen. :-D
musst dir jetz auch nich extra überlegen. ich guck morgen erst nochma in die forensuche, wollt dir nur
erstma antworten!

echt vielen dank! - hast mir jetz x min arbeit erspart 😉
 
xeon hat gesagt.:
nur: macht es einen unterschied, wenn ich die anstatt aufn desktop, in nen panel einbinde?

weil: wenn ich jetz eine verschiebe, bleibt auf der stelle noch eine - kann ich unendlich oft machen. :-D
Das geht nicht auf Panels. Kannst du das mal auf deutsch erklären :bahnhof:
 
k - die klasse, die zuerst ein JPanel war, erbt jetzt von JDesktopPane.

das ding ist, dass er mir die JInternalFrames zwar zeichnet, doch wenn ich eine verschieben will,
bleibt die originalframe da und ich verschiebe quasi nur eine kopie vom original.
diese kopie kann ich dann allerdings richtig verschieben.

wenns dir hilft, kann ich - wenn ich nach hause komme den code nochma posten!? - alles sehr eigenartig.
swing einstieg is doch nich so einfach 😉
 
so - war zeitlich etwas knapp....

musste noch n paar übungen für uni fertig machen 😉

das alte prob hab ich nich mehr, hab meine hosts (etc) jetzt direkt von JInternalFrame
erben lassen. naja... obs jetz elegant is!? 😀

also, ich hab die files ma gepackt und auf:
http://www.xeon-home.de/downloads/ConfiX.tar.gz
gestellt.

wär kewl, wenn du bei gelegenheit ma gucken könntest. eilt aber nich! 😉

greetz! XeoN

EDIT:
zuerst open Image -> demo.png
danach open config -> demo.cfg
 
ok - problem gelöst...

ich hätte vllt mal die ganze Host.java hier posten sollen, denn dadrin hatte ich mir selbst methoden getX() und getY() geschrieben.
konnte ja keiner ahnen, das JInternalFrame über die die position ermittelt 😉

trotzdem danke für die mühen!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben