kostenloser Webspace werbefrei: lima-city


mouseClicked/mousePressed? (+JFrame transparent machen?)

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Hi. Ich habe ein JFrame, welches setUndecorated(true); keinen Rand bzw. Titel mehr hat. Und ich will, das bei einem stinknormalen Mausklick sich etwas tut. Wenn aber gezogen wird, soll sich das Fenster Drag&Drop - mäßig verschieben lassen. Ich habe dazu einem MausListener registriert. Bisher war es so, das die Methode mouseClicked() eine Methode des JFrames aufgerufen hat. War auch bisher so gut. Nur um das verschieben zu realisieren, habe ich es jetzt so umgebaut, dass ein neuer Thread gestartet wird, wenn die Methode mousePressed() aufgerufen wird. Dieser führt Überprüfungen durch, und verändert die Position des JFrames je nach Cursor. Der Thread wird beendet, also die run verlassen, wenn eine Methode aufgerufen wird. Das geschiet in der Regel per mouseReleased(). Nur wird jetzt bei JEDEM klicken, auch wenn es noch so kurz ist nur mousePressed() verwendet. Ich habe es auch so umgebaut, dass am Beginn des Threads noch mal 50 ms. gewartet wird, und von mouseClicked() immer diese Methode aufgerufen wird, die dem Thread beendet. Aber egal wie kurz der Klicker ist, es hilft nicht, mouseClicked() wird nichtmehr registriert.

    Kann mir wer bitte sagen woran das liegt?


    Und kann man ein (bzw. besagtes) JFrame transparent schalten? Habe stundenlang gegooglet, aber nur Dinge wie setOpaque(true);, setBackground(new Color(0x000000, true));, JNative oder com.sun.awt.AWTUtilities/setWindowOpacity gefunden, was alles nichts geholfen hat. Insgesamt zeichnet ich nur ein Bild per Label, welches einen transparenten Rand hat. ATM schimmert da natürlich das JFrame durch, aber ich würde gerne das sehen, was sich hinter dem JFrame befindet.

    Gezeichnet wird vollgendermaßen:

    public void newPaint(BufferedImage bi, int sizeH, int sizeV)
    	{
    		if(this.panel != null)
    			this.remove(this.panel);
    		
    		if(bi == null)
    			bi = this.lastImg;
    		else
    			this.lastImg = bi;
    		
    		JLabel p = new JLabel();
    		ImageIcon i = new ImageIcon(bi);
    		
    		p.setLocation(0, 0);
    		p.setSize(sizeH, sizeV);
    		p.setIcon(i);
    		p.setOpaque(true);
    		p.setBackground(Color.white);
    		this.add(p);
    		this.panel = p;
    
    		this.setSize(sizeH, sizeV);
    		this.repaint();
    	}
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Moin,

    zu Problem 2 habe ich einige Links für Dich:

    http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows
    http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html
    http://www.pushing-pixels.org/?p=260
    http://www.pushing-pixels.org/?p=272

    Ich hoffe mal, dass Dir das weiterhilft.

    Zu Problem 1 habe ich einfach nur generell eine Frage:
    Warum nutzt Du einen neuen Thread, um die Verschiebung durchführen zu wollen?
    Brauchst Du für diesen Prozess denn unbedingt Nebenläufigkeit?
    Niemand würde doch während des Verschiebens mit der GUI selbst "arbeiten" oder irre ich?

    Gruß,
    Pawnee
  4. Es könnte sein, das ersteres nicht funktioniert, weil sie zur gleichen Adapterklasse gehören, die die folgenden Funktionen genau in dieser Reihenfolge ausführt: mousePressed() - mouseReleased() - mouseClicked() - actionPerformed(). Du kannst das Problem auf jeden Fall übergehen, wenn du statt mousePressed() und mouseReleased() einfach nur mouseDragged() (mit der Adapterklasse MouseMotionAdapter und dem Listener MouseMotionListener) benutzt und mouseClicked() so lässt, wie es ist.


    Beitrag geändert: 13.12.2008 11:07:08 von alphara
  5. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Danke, aber das mit dem transparenten kenne ich schon.
    com.sun.awt.AWTUtilities/setWindowOpacity

    Nur sieht man dann gleichzeitig auch durch das Bild durch, ich will aber dass das Bild klar ist und nur das JFrame durchsichtig ist, dass man dan quasi keinen Rand mehr hat.

    Problem 1 habe gelöst. War schon so gut, wie ich es hatte, nur hat er nicht lange genug gewartet. (50 ms abzuschätzen ist auch nicht so einfach wie es klingt.) Ich habe einen Thread verwendet, weil ich mal gelesen habe, dass man einem Listener so kurz wie möglich halten soll. Grund habe ich vergessen. Jetzt ist es so, dass wenn er ...Pressed() aufruft quasi ein Timer im Form eines Thread.sleep() startet, dieser 200 ms wartet, und wenn er in dieser Zeit ein ...Clicked() auslöst abbricht, bzw. sonst dem Verschiebevorgang startet.


    Edit: Danke alphara, habe deinen Post vorhin nur leider nicht gesehen, da ich vorher wärend dem Antworten unterbrochen wurde und deshalb seit ein paar Stunden das Browserfenster so wartet.

    Beitrag geändert: 13.12.2008 13:28:14 von lol4me
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!