Прежде чем все комментаторы начнут говорить «просто не смешивайте свинг и javafx», да, я знаю, я знаю. Это вызвало у нас много проблем за эти годы, но у моей команды есть куча кода, и у нас действительно нет бюджета, чтобы переписать все это в Javafx. Мы пытаемся постепенно переходить части нашего кода в Javafx с течением времени. Он имеет много классных функций, которые являются довольно зависимыми от Javafx. Это делает это, создавая невидимую стадию Javafx для владения всплывающими окнами (поскольку всплывающие окна не могут отображаться без окна владельца). < /P>
Я был доволен кодом в течение многих лет, но только недавно попытался запустить его на Linux впервые. Оказывается, что на Linux моя невидимая стадия не является невидимой, и я не могу найти никакого способа, чтобы он ушел. Я предполагаю, что это не конец света, если есть немного пустой сцены, но это довольно раздражает, и я хотел бы избавиться от этого. Я тестировал на Ubuntu с LXDE и GNOME. Он отлично работает в Windows, но в Linux фиктивная сцена видна и имеет свой собственный значок в панели задач.import java.awt.Dimension;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class FxOnSwingProblemDemo extends JFrame {
private Stage dummyStage;
public FxOnSwingProblemDemo() {
initializeFxToolkit();
JButton button = new JButton("Show popup");
button.addActionListener(e ->
Platform.runLater(() -> {
Popup popup = new Popup();
popup.getContent().add(new Label("Hey look, a popup!"));
popup.show(getDummyStage());
})
);
JPanel root = new JPanel();
root.add(button);
this.add(root);
this.setPreferredSize(new Dimension(500, 500));
this.pack();
//Note exit on close is important here to kill the FX Platform thread
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
private void initializeFxToolkit() {
Platform.setImplicitExit(false);
try {
SwingUtilities.invokeAndWait(JFXPanel::new);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private Stage getDummyStage() {
if(dummyStage == null) {
//Utility prevents icon from showing up on windows task bar
dummyStage = new Stage(StageStyle.UTILITY);
dummyStage.setScene(new Scene(new Pane()));
//Note, setting the width and height to very small numbers (so far tested with 0.1, 1, and 2)
//will result in GTK warnings that can't be suppressed printing to stderr on at least
//some linux environments. So we'll set it to a larger size. It really doesn't matter
//what size we pick as long as it is large enough to avoid the GTK warnings.
dummyStage.setWidth(100);
dummyStage.setHeight(100);
//Make it invisible
dummyStage.setOpacity(0.0);
//Don't allow closing
dummyStage.setOnCloseRequest(e -> e.consume());
dummyStage.show();
}
return dummyStage;
}
public static void main(String[] args) {
new FxOnSwingProblemDemo();
}
}
< /code>
Я попробовал все, что я могу придумать, чтобы сделать окно невидимым, но еще не нашел. Я также попытался посмотреть, есть ли способ отображения всплывающего окна без реального окна, сделав свой собственный подкласс окна, который на самом деле ничего не отображает, но я не получил очень далеко, так как много методов окна являются окончательными. Открыт для любых идей. Если мне придется просто написать качающуюся версию предупреждений, то, думаю, я сделаю, но я хотел бы избежать ее, если смогу.
Подробнее здесь: https://stackoverflow.com/questions/795 ... orm-manner
Отображение всплывающего окна Javafx в приложении Swing в кроссплатформенном виде ⇐ Linux
1744983453
Anonymous
Прежде чем все комментаторы начнут говорить «просто не смешивайте свинг и javafx», да, я знаю, я знаю. Это вызвало у нас много проблем за эти годы, но у моей команды есть куча кода, и у нас действительно нет бюджета, чтобы переписать все это в Javafx. Мы пытаемся постепенно переходить части нашего кода в Javafx с течением времени. Он имеет много классных функций, которые являются довольно зависимыми от Javafx. Это делает это, создавая невидимую стадию Javafx для владения всплывающими окнами (поскольку всплывающие окна не могут отображаться без окна владельца). < /P>
Я был доволен кодом в течение многих лет, но только недавно попытался запустить его на Linux впервые. Оказывается, что на Linux моя невидимая стадия не является невидимой, и я не могу найти никакого способа, чтобы он ушел. Я предполагаю, что это не конец света, если есть немного пустой сцены, но это довольно раздражает, и я хотел бы избавиться от этого. Я тестировал на Ubuntu с LXDE и GNOME. Он отлично работает в Windows, но в Linux фиктивная сцена видна и имеет свой собственный значок в панели задач.import java.awt.Dimension;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class FxOnSwingProblemDemo extends JFrame {
private Stage dummyStage;
public FxOnSwingProblemDemo() {
initializeFxToolkit();
JButton button = new JButton("Show popup");
button.addActionListener(e ->
Platform.runLater(() -> {
Popup popup = new Popup();
popup.getContent().add(new Label("Hey look, a popup!"));
popup.show(getDummyStage());
})
);
JPanel root = new JPanel();
root.add(button);
this.add(root);
this.setPreferredSize(new Dimension(500, 500));
this.pack();
//Note exit on close is important here to kill the FX Platform thread
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
private void initializeFxToolkit() {
Platform.setImplicitExit(false);
try {
SwingUtilities.invokeAndWait(JFXPanel::new);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private Stage getDummyStage() {
if(dummyStage == null) {
//Utility prevents icon from showing up on windows task bar
dummyStage = new Stage(StageStyle.UTILITY);
dummyStage.setScene(new Scene(new Pane()));
//Note, setting the width and height to very small numbers (so far tested with 0.1, 1, and 2)
//will result in GTK warnings that can't be suppressed printing to stderr on at least
//some linux environments. So we'll set it to a larger size. It really doesn't matter
//what size we pick as long as it is large enough to avoid the GTK warnings.
dummyStage.setWidth(100);
dummyStage.setHeight(100);
//Make it invisible
dummyStage.setOpacity(0.0);
//Don't allow closing
dummyStage.setOnCloseRequest(e -> e.consume());
dummyStage.show();
}
return dummyStage;
}
public static void main(String[] args) {
new FxOnSwingProblemDemo();
}
}
< /code>
Я попробовал все, что я могу придумать, чтобы сделать окно невидимым, но еще не нашел. Я также попытался посмотреть, есть ли способ отображения всплывающего окна без реального окна, сделав свой собственный подкласс окна, который на самом деле ничего не отображает, но я не получил очень далеко, так как много методов окна являются окончательными. Открыт для любых идей. Если мне придется просто написать качающуюся версию предупреждений, то, думаю, я сделаю, но я хотел бы избежать ее, если смогу.
Подробнее здесь: [url]https://stackoverflow.com/questions/79581147/displaying-a-javafx-popup-on-a-swing-app-in-cross-platform-manner[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия