Image im PopupMenu vom SystemTray

Ingerten

Bekanntes Mitglied
Hallo Männers,

hab da mal ne Frage, ob das überhaupt möglich ist, was ich vor habe.
Im Netz habe ich nicht wirklich was dazu gefunden.

Frage:
Ist es möglich, bei einem PopupMenu vom SystemTray, das man wie auf dem Bild, das rot markierte Feld noch anhängen und ein Image oder Icon einfügen kann?

popup.png
 

dzim

Top Contributor
Wenn du das Popup selbst implementierst, also keine Standart-Komponenten verwendest, dann ist die Antwort: Ja. Ansonsten: Nein.
Einfach, gel?
 

Ingerten

Bekanntes Mitglied
Ja, für den Profi ist es sicher einfach, aber ich bin kein Profi, sonst hätte ich ja nicht gefragt.

Kann mir da mal bitte jemand ein Beispiel zeigen, wie man so ein Popup selbst implementiert?
Ich finde da nich nichts im Netz oder ich stelle mich zu doof an.
 
Zuletzt bearbeitet:

dzim

Top Contributor
Trivial ist es tatsächlich nicht, denn ich wusste nicht, das JavaFX noch immer keine Tray-Icons nativ unterstützt. :-(
Daher bin ich von folgendem Beispiel ausgegangen, dass die AWT-TrayIcon-API dafür verwendet:
https://gist.github.com/jewelsea/e231e89e8d36ef4e5d8a
Problem bleibt aber, dass das Menü im Bsp. nur ein klassisches AWT-Menü ist und das ist kaum anpassbar und... hässlich.
Auch stört mich, das die JavaFX-Stage undekoriert in die Mitte des Schirms gesetzt wird. (Undekoriert ist noch ok, aber die Position eher nicht.)

Ich habe also etwas damit herumgespielt...

Java:
package jfxtest;

import java.awt.event.MouseListener;
import java.io.IOException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import javax.imageio.ImageIO;

// Java 8 code
public class JavaFXTrayIconSample extends Application {
	
	private static final String iconImageLoc = "http://icons.iconarchive.com/icons/scafer31000/bubble-circle-3/16/GameCenter-icon.png";
	
	private Stage stage;
	
	private Timer notificationTimer = new Timer();
	
	private DateFormat timeFormat = SimpleDateFormat.getTimeInstance();
	
	@Override
	public void start(final Stage stage) {
		this.stage = stage;
		
		Platform.setImplicitExit(false);
		
		javax.swing.SwingUtilities.invokeLater(this::addAppToTray);
		
		stage.initStyle(StageStyle.TRANSPARENT);
		
		StackPane layout = new StackPane(createContent());
		layout.setStyle("-fx-background-color: rgba(255, 255, 255, 1.0);");
		layout.setPrefSize(300, 200);
		
		layout.setOnMouseClicked(event -> stage.hide());
		
		Scene scene = new Scene(layout);
		scene.setFill(Color.TRANSPARENT);
		
		stage.setScene(scene);
	}
	
	/**
	 * For this dummy app, the (JavaFX scenegraph) content, just says "hello, world". A real app, might load an FXML or something like that.
	 *
	 * @return the main window application content.
	 */
	private Node createContent() {
		Label hello = new Label("hello, world");
		hello.setStyle("-fx-font-size: 40px; -fx-text-fill: forestgreen;");
		Label instructions = new Label("(click to hide)");
		instructions.setStyle("-fx-font-size: 12px; -fx-text-fill: orange;");
		
		VBox content = new VBox(10, hello, instructions);
		content.setAlignment(Pos.CENTER);
		
		return content;
	}
	
	/**
	 * Sets up a system tray icon for the application.
	 */
	private void addAppToTray() {
		try {
			// ensure awt toolkit is initialized.
			java.awt.Toolkit.getDefaultToolkit();
			
			// app requires system tray support, just exit if there is no support.
			if (!java.awt.SystemTray.isSupported()) {
				System.out.println("No system tray support, application exiting.");
				Platform.exit();
			}
			
			// set up a system tray icon.
			java.awt.SystemTray tray = java.awt.SystemTray.getSystemTray();
			URL imageLoc = new URL(iconImageLoc);
			java.awt.Image image = ImageIO.read(imageLoc);
			java.awt.TrayIcon trayIcon = new java.awt.TrayIcon(image);
			
			// if the user double-clicks on the tray icon, show the main app stage.
			// trayIcon.addActionListener(event -> Platform.runLater(() -> {
			// showStage(null, null);
			// }));
			
			// regardles of the mouse button you've clicked, the stage will be shown anyway
			trayIcon.addMouseListener(new MouseListener() {
				
				@Override
				public void mouseClicked(java.awt.event.MouseEvent e) {
					Platform.runLater(() -> {
						showStage(Double.valueOf(e.getX()), Double.valueOf(e.getY()));
					});
				}
				
				@Override
				public void mousePressed(java.awt.event.MouseEvent e) {}
				
				@Override
				public void mouseReleased(java.awt.event.MouseEvent e) {}
				
				@Override
				public void mouseEntered(java.awt.event.MouseEvent e) {}
				
				@Override
				public void mouseExited(java.awt.event.MouseEvent e) {}
			});
			
			java.awt.MenuItem exitItem = new java.awt.MenuItem("Exit");
			exitItem.addActionListener(event -> {
				notificationTimer.cancel();
				Platform.exit();
				tray.remove(trayIcon);
			});
			
			notificationTimer.schedule(new TimerTask() {
				@Override
				public void run() {
					javax.swing.SwingUtilities.invokeLater(() -> trayIcon.displayMessage("hello", "The time is now " + timeFormat.format(new Date()),
							java.awt.TrayIcon.MessageType.INFO));
				}
			}, 5_000, 60_000);
			
			tray.add(trayIcon);
		} catch (java.awt.AWTException | IOException e) {
			System.out.println("Unable to init system tray");
			e.printStackTrace();
		}
	}
	
	/**
	 * Shows the application stage and ensures that it is brought ot the front of all stages.
	 */
	private void showStage(Double clickX, Double clickY) {
		if (stage != null) {
			
			if (clickX != null && clickY != null) {
				
				final Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
				
				clickX = clickX + 50;
				
				Point2D fromCoordsUR = new Point2D(clickX + stage.getWidth(), clickY);
				Point2D fromCoordsLL = new Point2D(clickX, clickY + stage.getHeight());
				
				if (screenBounds.getMaxY() < fromCoordsLL.getY()) {
					clickY = screenBounds.getHeight() - stage.getHeight();
				}
				if (screenBounds.getMaxX() < fromCoordsUR.getX()) {
					clickX = screenBounds.getWidth() - stage.getWidth();
				}
				stage.setX(clickX);
				stage.setY(clickY);
			}
			
			stage.show();
			stage.toFront();
		}
	}
	
	public static void main(String[] args) throws IOException, java.awt.AWTException {
		launch(args);
	}
}

Jetzt musst du nur noch das Layout des anzuzeigenden Fensters anpassen und dafür sorgen, dass es nicht bei jeden Klick verschwindet, sondern erst beim Klick auf einen Eintrag deines gefakten Menüs, das in dem Layout enthalten ist...

Ungefähr klar, was ich meine?
 

Ingerten

Bekanntes Mitglied
Hey danke @dzim, das du dir die Arbeit gemacht hast, das hat mir sehr weiter geholfen.

Wenn auch jemand den Code von @dzim mal testen will, dann solltet ihr in Zeile 162, 163, 166 und 169, von stage.getWidth() in layout.getPrefWidth(), bzw. stage.getHeight() in layout.getPrefHeight() ändern,
sonst fehlen beim ersten MouseClick die Werte und der StackPane() ist nicht an der richtigen Position.

Danke nochmal für die Hilfe
 

dzim

Top Contributor
Ah!
Das war der Grund! :)
Ich hatte mich da schon gewundert, aber nicht weiter nachgeschaut. ;-)

Ist eigentlich auch logisch, solang die Stage noch nie zuvor gezeigt wurde... *facepalm*
 

Ingerten

Bekanntes Mitglied
Na ja, es ging um die andere Sache, so ein Fehler findet der "nicht Profi(also ich)" auch noch und ich freue mich, wenn ich den "Profi(also du)" auch mal helfen kann :), aber du hättest den fehler sicher selber gefunden.

Danke nochmal für deine Unterstützung.

Jetzt habe ich nur noch ein Problem, ich muss mich jetzt mit JavaFX beschäftigen, das habe ich immer etwas vernachlässigt.

LG
 

Ingerten

Bekanntes Mitglied
Das Menü und das bild in das Layout zu bringen, aber das bekomme ich schon hin, sollte ja nicht so schwer sein, denke ich mal.

Wenn nicht, dann weiss ich ja, wo ich hilfe bekomme.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
L AWT .gif image transparent machen AWT, Swing, JavaFX & SWT 3
kodela angezeigtes Image entfernen AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
T Swing Buffered Image anzeigen AWT, Swing, JavaFX & SWT 45
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
S Stretch Image in ImageView AWT, Swing, JavaFX & SWT 4
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
L JavaFX Image mit Blureffect AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L JavaFX leeres weißes Image - javafx.scene.image.Image AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
B Graphics to Image AWT, Swing, JavaFX & SWT 3
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
T Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
T Image aus "nicht-src-ordner" AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Image in JTable einfügen AWT, Swing, JavaFX & SWT 9
M Image aus MS Access anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
G JavaFX Image vergrößern AWT, Swing, JavaFX & SWT 5
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Speicherproblem SWT.Image in Nebula-Gallery AWT, Swing, JavaFX & SWT 3
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
D JLabel Image ausrichten AWT, Swing, JavaFX & SWT 2
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
I Image Button AWT, Swing, JavaFX & SWT 4
U IntBuffer zum Image konvertieren. AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
K Swing Warum bleibt das Image immer gleich AWT, Swing, JavaFX & SWT 4
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
D Image.getScaledInstance() vs. Netzwerkverbindung??? AWT, Swing, JavaFX & SWT 2
reibi SWT Image viewer AWT, Swing, JavaFX & SWT 2
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
A Applet .gif in applet Image nicht animiert angezeigt AWT, Swing, JavaFX & SWT 4
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
S Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 2
0 Mousecurser mit Image hinterlegen AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
N Java Choice Bilderausgabe - images - - image - AWT, Swing, JavaFX & SWT 2
D iText PdfPCell mit Image AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S Button mit Image AWT, Swing, JavaFX & SWT 7
A Skaliertes Image pixelweise bearbeiten AWT, Swing, JavaFX & SWT 6
L Swing Image zur Laufzeit verändern AWT, Swing, JavaFX & SWT 6
F SWT GC drawText auf halbtransparentem Image AWT, Swing, JavaFX & SWT 21
G Swing JEdtitorPane und HTML Image Seite AWT, Swing, JavaFX & SWT 2
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
D SWT Image Farbtiefe AWT, Swing, JavaFX & SWT 2
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
lumo SWT Composite + Image + zeichnen AWT, Swing, JavaFX & SWT 4
V Ein Image als Button (nicht mit JButton(Icon)) AWT, Swing, JavaFX & SWT 5
D Image Viewer gesucht AWT, Swing, JavaFX & SWT 5
Kr0e Image schärfen AWT, Swing, JavaFX & SWT 2
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
T Image auf Image zeichnen AWT, Swing, JavaFX & SWT 2
E Warum ist offscreen (mit Image) schneller? AWT, Swing, JavaFX & SWT 11
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
H Image abspeichern AWT, Swing, JavaFX & SWT 4
B Swing Image als Hintergrund im JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
W Image in jar einbauen AWT, Swing, JavaFX & SWT 20
Luk10 AWT Image und die Skalierung! AWT, Swing, JavaFX & SWT 3
L JPanel als Image speichern AWT, Swing, JavaFX & SWT 3
Developer_X Image Texels filtern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben