Добавление JPanel в Javafx

В настоящее время я работаю над решением для цифровых подписей. Я получил фирменный планшет с API. API закрыто и я ничего не могу в нем изменить. Проблема сейчас для меня в том, что я не могу справиться с ответами устройства. Делая подпись или что-то рисуя, я получаю ответ в виде JPanel. Поскольку я программирую сцены JavaFX, теперь я не знаю, как включить JPanel в свою сцену. Я только научился работать с JavaFx, поэтому я мало что знаю о JPanels и прочем.

Итак... Интересно, есть ли способ добавить Jpanel в FlowPane. Все, что я нашел по этой теме, это темы об обратном. Когда люди пытались добавить javafx-компоненты в Jpanel. Но не так.. так что, может быть, это очень очевидно, как это сделать, но я этого не понимаю.

JPanel x = pad.startSiganture();
FlowPane flow = new FlowPane();
flow.getChildren.addAll(x);

В принципе, это то, о чем я мечтал, что, конечно, не работает. Итак.. Спасибо за любые ответы, я надеюсь, что это возможно.

YXCD


person YXCD    schedule 25.10.2019    source источник


Ответы (2)


Да, это возможно: добавьте свою JPanel в SwingNode, а затем поместите ее в свою FlowPane:

SwingNode node = new SwingNode()
node.setContent(pad.startSiganture());
FlowPane flow = new FlowPane();
flow.getChildren.addAll(node);
person Finn von Holten    schedule 25.10.2019

да, это достижимо через SwingNode, который является узлом javafx, который может содержать свинг-контент, см., что говорится в документации:

Этот класс используется для встраивания содержимого Swing в приложение JavaFX. Отображаемое содержимое указывается с помощью метода setContent(javax.swing.JComponent), который принимает экземпляр Swing JComponent. Иерархия компонентов, содержащихся в экземпляре JComponent, не должна содержать тяжеловесных компонентов, иначе SwingNode может не отобразить его. Содержимое перекрашивается автоматически. Все события ввода и фокуса пересылаются в экземпляр JComponent прозрачно для разработчика.

Вот типичный шаблон, демонстрирующий, как можно использовать SwingNode:

public class SwingFx extends Application {

     @Override
     public void start(Stage stage) {
         final SwingNode swingNode = new SwingNode();
         createAndSetSwingContent(swingNode);

         StackPane pane = new StackPane();
         pane.getChildren().add(swingNode);

         stage.setScene(new Scene(pane, 100, 50));
         stage.show();
     }

     private void createAndSetSwingContent(final SwingNode swingNode) {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
                 swingNode.setContent(new JButton("Click me!"));
             }
         });
     }

     public static void main(String[] args) {
         launch(args);
     }
 }
person Lukas Owen    schedule 25.10.2019