我想爲網站開發一個客戶端應用程序。隱藏JavaFx fxml或JavaFx swing應用程序到系統托盤
我希望應用程序在最小化時駐留在系統托盤中。
我不知道如何完成這項任務。
是他們這種類型的操作的任何示例。
我想爲網站開發一個客戶端應用程序。隱藏JavaFx fxml或JavaFx swing應用程序到系統托盤
我希望應用程序在最小化時駐留在系統托盤中。
我不知道如何完成這項任務。
是他們這種類型的操作的任何示例。
此處的關鍵是將隱式退出設置爲false Platform.setImplicitExit(false);
對於在新線程中顯示和隱藏舞臺也很重要。
Platform.runLater(new Runnable() {
@Override
public void run() {
stage.show();
}
});
Platform.runLater(new Runnable() {
@Override
public void run() {
stage.hide();
}
});
接下來,整個代碼:
import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javax.imageio.ImageIO;
/**
*
* @author alvaro
*/
public class TrayTest extends Application {
private boolean firstTime;
private TrayIcon trayIcon;
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
createTrayIcon(stage);
firstTime = true;
Platform.setImplicitExit(false);
Scene scene = new Scene(new Group(), 800, 600);
stage.setScene(scene);
stage.show();
}
public void createTrayIcon(final Stage stage) {
if (SystemTray.isSupported()) {
// get the SystemTray instance
SystemTray tray = SystemTray.getSystemTray();
// load an image
java.awt.Image image = null;
try {
URL url = new URL("http://www.digitalphotoartistry.com/rose1.jpg");
image = ImageIO.read(url);
} catch (IOException ex) {
System.out.println(ex);
}
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
hide(stage);
}
});
// create a action listener to listen for default action executed on the tray icon
final ActionListener closeListener = new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
System.exit(0);
}
};
ActionListener showListener = new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
Platform.runLater(new Runnable() {
@Override
public void run() {
stage.show();
}
});
}
};
// create a popup menu
PopupMenu popup = new PopupMenu();
MenuItem showItem = new MenuItem("Show");
showItem.addActionListener(showListener);
popup.add(showItem);
MenuItem closeItem = new MenuItem("Close");
closeItem.addActionListener(closeListener);
popup.add(closeItem);
/// ... add other items
// construct a TrayIcon
trayIcon = new TrayIcon(image, "Title", popup);
// set the TrayIcon properties
trayIcon.addActionListener(showListener);
// ...
// add the tray image
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(e);
}
// ...
}
}
public void showProgramIsMinimizedMsg() {
if (firstTime) {
trayIcon.displayMessage("Some message.",
"Some other message.",
TrayIcon.MessageType.INFO);
firstTime = false;
}
}
private void hide(final Stage stage) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (SystemTray.isSupported()) {
stage.hide();
showProgramIsMinimizedMsg();
} else {
System.exit(0);
}
}
});
}
}
據我所知在JFX 8中是可以的。現在最好的解決方案是將你的應用程序嵌入到AWT中並隱藏AWT窗口本身。
你能不能給我這個工作實例鍵入你解釋... –
@ alscu的答案是你解釋..謝謝 –
JavaFx 8已經出來了。現在可以在沒有AWT的情況下使用系統托盤嗎? JavaFx看起來好多了。 – qed
正確答案爲[這裏](http://stackoverflow.com/a/12571924/1624376) – Aubin