SWT Fenster bei MouseOver vergrößern

Antimon

Mitglied
Hallo zusammen,

ich habe folgendes vor:
Es soll auf dem Desktop ein kleines Fenster dauerhaft im Vordergrund zu sehen sein, in dem ich eine Tätigkeit erfasse - sprich eine Aufgabe, an der ich gerade arbeite (da läuft z.B. drin eine Stoppuhr).
Wenn man mit dem Mauszeiger über dieses Fenster fährt, soll es sich vergrößern und mehrere (pausierte) Aufgaben anzeigen, von denen ich dann z.B. eine andere als aktive Aufgabe auswählen kann. Sprich, eine ToDo-Liste, die im Normalfall wenig Platz auf dem Desktop benötigt, aber auch schnell vergrößert werden kann.

Die erste Frage dazu wäre: Es soll ein undekoriertes, evtl. sogar etwas transparentes Fenster sein, was ist dafür am besten geeignet? Eine Shell? Ein Dialog? Wichtig ist: Es soll von keinem anderen Programm verdeckt werden und eben undekoriert sein...

Die nächste Frage ist die: Wie schaffe ich es, abzufragen ob sich der Mauszeiger innerhalb des Fensters befindet? Wenn ich nämlich bei der Shell die mouseEntered und mouseExited-Events abfange, dann werden die auch empfangen wenn der Mauszeiger auf z.B. ein Label innerhalb der Shell bewegt wird. Denn in dem Moment, in dem sich der Mauszeiger auf das Label bewegt, verlässt er ja quasi die Shell und erreicht das Label. Aber ich möchte natürlich nur wissen, ob das Fenster an sich verlassen wird oder nicht. Bei Swing habe ich was von "Event Bubbling" gelesen, kann man bei SWT die Events auch an das Eltern-Element weiterreichen, damit die Kindelemente nicht alle Events vorher abfangen?
 

dzim

Top Contributor
Also bis zur separaten (undekorierten) Shell kann ich dir verraten dass es auf jeden Fall geht - ich habe mir so mal einen etwas speziellen TableCellEditor geschrieben, wenn ich mich recht entsinne.
Den Alpha-Kanal solltest du auch steuern können, aber ich glaube, dass das dann für alle Kind-Element ebendso gilt, ob das hilfreich ist, weiß ich nicht. Auch habe ich nie mit einer Art von Transition in SWT gespielt. Geht sicher, aber wie gut, kann ich dir nicht sagen... Das grösste Problem aber wäre für mich das genannte Event-Bubbling...
Ich versuche mal den Code von damals zu finden und vor allem da drin das genannte Scenario.

Und das folgende ist zwar auch keine grosse Hilfe, aber hast du schon mal überlegt, dass mit JavaFX zu machen? Undekorierte Fenster, Transparenz, Effekte und so ein Eye-Candy sind da recht einfach umzusetzen - aber auch mit dem mouseEnter und -Exit müsste ich erst testen...

Argh... Meine Eclipse-Einstellungen (Target-Platform) verhindern gerade einen Test und daran herumschrauben möchte ich gerade nicht. Sorry...
 

Antimon

Mitglied
Also Alpha-Kanal, Größenänderung des Fensters, undekorierte Shell im Vordergrund - das habe ich schon alles hinbekommen. Mir ist nur nicht klar, ob ein Programm prinzipiell nur eine Shell haben soll oder ob es nicht stört, wenns mehrere gibt...

Mein größtes Problem ist wirklich auch das Enter-/Exit-Event... denn bei meinen Tests flattert das Fenster - kommt man ins Fenster, vergrößert es sich, wenn man dann aber auf ein Kind-Element kommt, verkleinert es sich wieder, etc.

Ich habe es auch schon versucht, mit den Bounds und der Position des Mauszeigers zu lösen, aber das funktioniert auch nicht so zufriedenstellend, denn da werden ja auch die Events von Kindelementen abgefangen. Und wenn z.B. ein Panel am Rand der Shell ist und man die Maus zu schnell bewegt, kann es sein dass keine Events auf der Shell erzeugt werden und das Fenster somit nicht verkleinert wird, obwohl sich der Mauszeiger nicht mehr innerhalb befindet...

JavaFX wollte ich mir schon mal anschauen, bin aber ehrlich gesagt noch nicht dazugekommen, SWT ist derzeit das Mittel meiner Wahl, weil ich das von meiner RCP-Umgebung so gewohnt bin... ;)
 

dzim

Top Contributor
Leider habe ich gerade wirklich Probleme, meine TargetPlatform entsprechend zu setzen, daher ist es für mich einfacher, dir zu zeigen, wie es in JavaFX geht.
Grundsätzlich aber gilt: Du kannst JavaFX in SWT ja einbinden - wenn die jfxrt.jar in deinem Classpath ist (ich glaube, das genügt), dann kannst du ja eine SWT-Applikation haben, die ein schwebendes Fenster in JavaFX triggert. Da SWT und JavaFX auf dem selben thread laufen, kannst du es ohne weiteres integrieren.

Hier mal etwas Beispielcode:

Main (darauf kannst du wahrscheinlich verzichten, wenn du es von SWT aus aufrufst)
Java:
public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Main.fxml"));
			Scene scene = new Scene(root,400,400);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

Main.fxml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Do not edit this file it is generated by e(fx)clipse from ../src/jfxtest/Main.fxgraph
-->

<?import java.lang.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="jfxtest.MainController">

<center>
<Button fx:id="button" text="Click me!" onAction="#handleButton"/>
</center>
</BorderPane>
[/XML]

MainController (wenn du es aus SWT heraus aufrufst, musst du in deinem SWT-Code nun eigentlich nur den Teil aus handleButton machen - ich glaub der Owner der neuen Stage darf null sein)
Java:
public class MainController {
	
	@FXML
	private Button button;
	
	@FXML
	public void initialize() {
		
	}
	
	@FXML
	public void handleButton(ActionEvent event) {
		
		Stage stage = new Stage(StageStyle.UNDECORATED);
		stage.initOwner(button.getScene().getWindow());
		stage.initModality(Modality.APPLICATION_MODAL);
		stage.setOpacity(1);
		stage.setTitle("Floating Window");
		
		Pane floatingWindowPane = null;
		try {
			floatingWindowPane = (Pane) FXMLLoader.load(getClass().getResource("FloatingWindow.fxml"));
			floatingWindowPane.setScaleX(0.5);
			floatingWindowPane.setScaleY(0.5);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (floatingWindowPane != null) {
			Scene scene = new Scene(floatingWindowPane, 200, 200);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			stage.setScene(scene);
			stage.show();
		}
	}
}

Das war die Vorbereitung. Wenn du nun den Button auf der Seite klickst, dann wird zentriert auf dem ersten Monitor ein undekoriertes Fenster eingeblendet, das wiederum ein Label und einen Button zum schliessen hat.

FloatingWindow.fxml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Do not edit this file it is generated by e(fx)clipse from ../src/jfxtest/FloatingWindow.fxgraph
-->

<?import java.lang.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com/fxml" fx:id="vbox" fx:controller="jfxtest.FloatingWindowController" style="-fx-border-color:black;-fx-border-width:5;-fx-border-insets:6px;" onMouseEntered="#handleVBoxMouseEntered" onMouseExited="#handleVBoxMouseExited" onMouseMoved="#handleVBoxMouseMoved">

<Label fx:id="label" text="Hello World" alignment="CENTER">
<maxWidth><Double fx:constant="MAX_VALUE" /></maxWidth>
<VBox.margin>
<Insets top="25"/>
</VBox.margin>
</Label>
<Button fx:id="button" text="Click me to Close!" alignment="CENTER" onAction="#handleButton">
<maxWidth><Double fx:constant="MAX_VALUE" /></maxWidth>
<VBox.margin>
<Insets top="25"/>
</VBox.margin>
</Button>
<padding>
<Insets left="5" right="5" top="5" bottom="5"/>
</padding>
</VBox>
[/XML]

Der FloatingWindowController ist eigentlich recht einfach: Im Code oben hast du vielleicht schon die #setScale*-Methoden gesehen - damit halbiere ich die Grösse des Fensters. Der Controller setzt dashin und her. EventBubbling ist nicht nötig (auch wenn ich über den Button fahre, wird die Grösse nicht verändert)
Java:
public class FloatingWindowController {
	
	@FXML
	private VBox vbox;
	@FXML
	private Label label;
	@FXML
	private Button button;
	
	@FXML
	public void initialize() {}
	
	@FXML
	public void handleButton(ActionEvent event) {
		((Stage) button.getScene().getWindow()).close();
	}
	
	@FXML
	public void handleVBoxMouseEntered(MouseEvent event) {
		vbox.setScaleX(1);
		vbox.setScaleY(1);
	}
	
	@FXML
	public void handleVBoxMouseExited(MouseEvent event) {
		vbox.setScaleX(0.5);
		vbox.setScaleY(0.5);
	}
	
	@FXML
	public void handleVBoxMouseMoved(MouseEvent event) {
		
	}
}

Tut mir leid, dass ich dir nicht mit SWT-Code weiterhelfen konnte, aber ich hatte jetzt keine Lust auf exorbitanten Aufwand - der Code oben hat mich ca. 5min gkostet, der Versuch SWT hinzubekommen 15...

Ich hoffe, du bekommst es aber trotzdem noch nur mit SWT hin!
 

Antimon

Mitglied
Dankeschön, das klingt recht vielversprechend - auch wenn ich nicht weiss ob/wie ich SWT und JavaFX für mein Vorhaben kombinieren kann. Aber ich schau mir das mal an, grad das mit CSS find ich sehr interessant.

Allerdings schaut es für mich so aus als ob bei JavaFX und SWT das Eventhandling etwas anders abläuft... mal sehen.

Danke auf jeden Fall schon mal für deine Mühe!
 

dzim

Top Contributor
Ja. Beide verwenden zwar den selben Thread, aber alles andere ist nicht ansatzweise ähnlich... Ich habe mal in einem Eclipse-RCP-Projekt aus purem Spaß einmal einen der Views komplett in JFX geschrieben. Es geht schon, aber man muss sich dann eben mit zwei unterschiedlichen Konzepten für UI rumschlagen...
Ich drück dir die Daumen, dass es dir in SWT noch gelingt! Wenn, dann poste bitte mal den Code, das finde ich auch interessant!

Grüsse
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
Tort-E JavaFX Fenster nachladen AWT, Swing, JavaFX & SWT 1
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
U Fenster beim Vergörßern immer quadratsich AWT, Swing, JavaFX & SWT 7
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3
G Scrollbar für das Fenster einfügen AWT, Swing, JavaFX & SWT 3
X Fenster von außen ansprechen AWT, Swing, JavaFX & SWT 7
brunothg Swing JTable -> AUTO_RESIZE_OFF aber das Fenster ausfüllen AWT, Swing, JavaFX & SWT 0
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
C Umrechner im/mit Fenster AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben