Mausposition abfragen ohne Event

barsiq

Mitglied
Tagchen,

ich habe wieder eine Frage, die evtl. banal ist.

Ich realiziere gerade ein Verhalten einer unserer Komponenten. Folgendes soll erreicht werden:
Ein JComponent XYZ soll durch das Ziehen an dem Header (ebenfalls ein JComponent) aus dem ContentPane des JFrames gelöst und in ein JInternalFrame umgepackt werden.
Dieses JInternalFrame (das ist das Problem!!) soll dabei an der Maus "kleben", bis die losgelassen wird.

Jemand einen Plan?

Dieses JComponent XYZ bildet ein Modell ab. Bei dieser Transformation wird das XYZ in JFrame entfernt und ein neues (gleiches Modell natürlich) in JInternalFrame plaziert.
 
Hier ist das Rausziehen von XYZ

Code:
		Header.addMouseMotionListener(new MouseMotionAdapter(){
			@Override
			public void mouseDragged(MouseEvent e) {
				Model.moveToPopup();
			}
		});
 
Hallo,

das ist ja nett, dass du deinen Code anderen zur Verfügung stellen möchtest. Du solltest aber auch mal erklären, was die Klasse Model ist und was in der Methode moveToPopup gemacht wird.

MFG

Sascha
 
;)
Also, ein Modell represintiert ein Funkkanal beim analogen Funk in unserer Applikation.
Code:
public class DHPFunkFensterModell extends Observable implements Comparable<DHPFunkFensterModell>{

	private String	KanalNummer;
	private String	Text;
	private boolean	Angedockt;
	private Point	Koordinaten;

	private DHPFunkPanel FunkPanel; // Ein Modell und ein Panel sind doppelseitig verkettet.

	private Zustand TastenZustand = null;

	public enum Zustand{
		FREI, FREMDBELEGT_INTERN, FREMDBELEGT_EXTERN, EIGENBENUTZUNG
	}

	// Flags
	private boolean	ZuSchliessen = false;	//	ob's geschloßen werden soll
	private boolean	ZumPopup = false;	//	ob's vom angedockten zum Popup gemacht werden soll
	private boolean	ZumAndocken = false;	//	ob's vom Popup wieder angedockt werden soll
	private boolean	ZumNeuen = false;	//	ob's ein neues Fenster wird

	/**
	 * Der Standardconstructor
	 * @param kanalNr
	 */
	public DHPFunkFensterModell(String kanalNr){
		this.KanalNummer = kanalNr;
		this.setTastenZustand(Zustand.FREI);
	}

	/**
	 * Wechselt den Tastenzustand auf einen neuen Wert
	 * @param tastenZustand
	 */
	public void setTastenZustand(Zustand tastenZustand) {
		TastenZustand = tastenZustand;
		setChanged();
		notifyObservers();
	}

	public void refresh(){
		setTastenZustand(TastenZustand);
	}
	/**
	 * Macht ein angedocktes neues FunkFenster auf 
	 */
	public void addFunkFenster(){
		ZumNeuen = true;
		setChanged();
		notifyObservers();
	}

	/**
	 * Löscht das Funkfenster
	 */
	public void deleteFunkFenster(){
		ZuSchliessen = true;
		setChanged();
		notifyObservers();
	}

	/**
	 * Popt ein angedocktes Funkfenster auf
	 */
	public void moveToPopup(){
		ZumPopup = true;
		setChanged();
		notifyObservers();
	}

	/**
	 * Dockt ein aufgepoptes Funkfenster wieder an.
	 */
	public void dockBack(){
		ZumAndocken = true;
		setChanged();
		notifyObservers();
	}
...
	/**
	 * Vergleicht this mit dem other anhand von Kanalnummern
	 */
	@Override
	public int compareTo(DHPFunkFensterModell other) {
		return getKanalNummer().compareTo(other.getKanalNummer());
	}
...
}

Der dazugehörige Observer:
Code:
public class DHPFunkContainer implements Observer{

	private ArrayList<DHPFunkFensterModell> FunkFensterListe = null;
	private ArrayList<DHPFunkPopup> FunkPopupListe = null;
	private DHPFunkFensterModell [] AngedocktePanels = null;

	private FunkComponent FunkContainer = null;

	private DHPNeuFunkPopup NeuFunkPopup = null;
	
	private boolean Loaded = false;
	
	private int Hoehe = 0;
	
	public FunkComponent getFunkContainer(int x, int y, int w, int h) {

		Hoehe = h;
		
		if (FunkContainer == null){
			FunkFensterListe = new ArrayList<DHPFunkFensterModell>();
			FunkPopupListe = new ArrayList<DHPFunkPopup>();
			AngedocktePanels = new DHPFunkFensterModell[getFreiKanalListe().size()];
			FunkContainer = new FunkComponent(x,y,w,h, 0);
			//	Load default FunkFenster
			for (String str : DHPAsgard.getDBLayer().getApplicationInfos("FUNKKANAELE").split(";"))
				createFunkFenster(str);
			Loaded = true;
		}
		return FunkContainer;
	}
...
	@Override
	public void update(Observable obs, Object arg) {
		// NUR FÜR BESTEHENDE KANAELE
		for (DHPFunkFensterModell model : FunkFensterListe)
			if (obs == model){
				if (model.isZuSchliessen()){
					deleteModel(model);
					return;
				}
				if (model.isZumPopup()){
					moveToPopup(model);
					return;
				}
				if (model.isZumAndocken()){
					dockBack(model);
					return;
				}
				if (model.getTastenZustand() == Zustand.FREI){
					model.setText("");
					model.getFunkPanel().getActionButton().setButtonColor(DHP_GUI_Constants.FP_FREI);
					model.getFunkPanel().setRichtung(FunkFenster.KEIN_PFEIL);
//					model.getFunkPanel().setMainText("");
					model.getFunkPanel().setFunctionality(true);
					model.getFunkPanel().refresh();
					return;
				}
				if (model.getTastenZustand() == Zustand.EIGENBENUTZUNG){
					model.getFunkPanel().getActionButton().setButtonColor(DHP_GUI_Constants.FP_EIGENBENUTZUNG);
					model.getFunkPanel().setRichtung(FunkFenster.INTERN);
					model.getFunkPanel().setFunctionality(true);
					model.getFunkPanel().refresh();
					return;
				}
				if (model.getTastenZustand() == Zustand.FREMDBELEGT_INTERN){
					model.getFunkPanel().getActionButton().setButtonColor(DHP_GUI_Constants.FP_FREMDBELEGT);
					model.getFunkPanel().setRichtung(FunkFenster.INTERN);
					model.getFunkPanel().setFunctionality(false);
					model.getFunkPanel().refresh();
					return;
				}
				if (model.getTastenZustand() == Zustand.FREMDBELEGT_EXTERN){
					model.getFunkPanel().getActionButton().setButtonColor(DHP_GUI_Constants.FP_FREMDBELEGT);
					model.getFunkPanel().setRichtung(FunkFenster.EXTERN);
					model.getFunkPanel().setFunctionality(false);
					model.getFunkPanel().refresh();
					return;
				}
			}
		// NUR FÜR NEUE FUNKFENSTERN
		if (obs instanceof DHPFunkFensterModell)
				addModel((DHPFunkFensterModell)obs);		
	}
...	
	protected void dockBack(DHPFunkFensterModell model){
		model.setZumAndocken(false);
		deletePopup(model);
		addAngedockt(model);
		updateFunkContainer();
	}

	protected void moveToPopup(DHPFunkFensterModell model){
		model.setZumPopup(false);
		deteleAngedockt(model);
		updateFunkContainer();
		DHPFunkPopup popup = new DHPFunkPopup(model);
		model.refresh(); // TODO
		FunkPopupListe.add(popup);
		DHPAsgard.getMainFrame().getLayeredPane().add(popup);
		popup.hide();
		popup.show();
	}
...
	private void updateFunkContainer(){
		for (Component element : FunkContainer.FunkFeld.getComponents()){
			if (element instanceof DHPFunkPanel){
				FunkContainer.FunkFeld.remove(element);
			}
		}
		for (DHPFunkFensterModell model : FunkFensterListe){
			if (model.isAngedockt()){
				DHPFunkPanel panel = new DHPFunkPanel(model);
				model.setFunkPanel(panel);
				model.refresh();
				FunkContainer.FunkFeld.add(panel);
				FunkContainer.FunkFeld.setSize(getFunkfeldSize());
				FunkContainer.FunkFeld.setPreferredSize(getFunkfeldSize());
			}
		}
		if (NeuFunkPopup != null && NeuFunkPopup.isVisible())
			NeuFunkPopup.updateModel();
		FunkContainer.FunkFeld.repaint();
		FunkContainer.repaint();
	}
...
}
 
Zuletzt bearbeitet:
Zurück