2013-06-03 4 views
2

У меня есть огромное приложение для качания, и я хотел вставить javafx в него. Я пробовал много раз, чтобы сделать это (следуя инструкциям оракула и т. Д.), И мне это удастся, только когда я объявил новый JFrame для использования компонента JFXPanel. Но я не хочу использовать новый фрейм, я хочу включить свой код Javafx в корневой JFrame приложения swing.Вставить Javafx в swing приложение

Можем ли мы встраивать компоненты javaFX в JPanel вместо JFrame? Если да, то почему мне это не удалось?

Существует пример кода, который, вероятно, неправильно:

Этот класс непосредственно расширяет JPanel и метод инициализации вызывается в EDT

private void initialize(){ 

    setLayout(new BorderLayout()); 

    final JFXPanel fxPanel = new JFXPanel(); 
    JPanel jp = new JPanel(); 

    jp.add(fxPanel); 
    jp.setVisible(true); 
    jp.setSize(500, 300); 
    jp.setBackground(Color.CYAN); 

    Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
    initFX(fxPanel); 
    } 
    }); 

    add(createButtonsPanel(), BorderLayout.NORTH); 
    add(jp,BorderLayout.CENTER); 
} 


private static void initFX(JFXPanel fxPanel) { 
    Scene scene = initScene(); 
    fxPanel.setScene(scene); 
} 


private static Scene initScene(){ 

    Group root = new Group(); 
    Scene scene = new Scene(root, javafx.scene.paint.Color.ALICEBLUE); 
    Text text = new Text(); 
    text.setX(40); 
    text.setY(100); 
    text.setFont(new Font(25)); 
    text.setText("Welcome JavaFX!"); 
    root.getChildren().add(text); 
    return (scene); 

} 
+0

Прошу прощения, но что именно происходит не так? – Sebastian

+0

На самом деле содержимое JavaFX в моем JPanel скрыто. Мы можем видеть только компоненты поворота – Baya

ответ

1

Наконец, я нашел способ, чтобы сделать JavaFX работы. Я наследовал класс SwingJFXCombo от абстрактного класса SimplePullerPanel, который предоставляет методы обработки вытягивания (SimplePullerPanel расширяет абстрактный класс PullerPanel, который расширяет JPanel). Чтобы сделать эту работу я переопределить метод buildContentPanel в нашем SwingJFXCombo классе

public abstract class SimplePullerPanel extends PullerPanel implements PropertyChangeListener 
{ 
    ... 

    protected abstract JComponent buildContentPanel(); 

    @Override 
    protected void buildPanel() 
    { 

     JComponent oContentPanel = buildContentPanel(); 
     JPanel panel = new JPanel(); 
     panel.add(oContentPanel); 

     setLayout(new BorderLayout()); 
     add(panel, BorderLayout.CENTER); 
    } 

    ... 
} 

public class SwingJFXCombo extends SimplePullerPanel{ 

    final JFXPanel fxPanel = new JFXPanel(); 

    public SwingJFXCombo(){ 
     setName("fx sample"); 
    } 

    private static void initFX(JFXPanel fxPanel) { 
     Scene scene = createScene(); 
     fxPanel.setScene(scene); 
    } 

    private static Scene createScene(){ 
     Group root = new Group(); 
     Scene scene = new Scene(root, javafx.scene.paint.Color.ALICEBLUE); 

     Text text = new Text(); 
     text.setX(40); 
     text.setY(100); 
     text.setFont(new Font(25)); 
     text.setText("Welcome JavaFX!"); 
     root.getChildren().add(text); 
     return (scene); 
    } 

    @Override 
    protected JComponent buildContentPanel() 
    { 
     JPanel frame = new JPanel(); 
     frame.add(fxPanel); 
     frame.setSize(800, 600); 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() 
      { 
       initFX(fxPanel); 
      } 
     }); 
     return frame; 
    } 
} 

Это не объясняет, почему предыдущий код не работает, и я заметил, что если я хочу, чтобы создать свой обычай SimplePullerPanel, удалив некоторые методы что я не использую, я сталкиваюсь с той же проблемой. Очень странно

2

Туков кода, превратили его в SSCCE - все похоже, работает, что указывает на то, что проблема находится в другом месте вашего кода. Можете ли вы воспроизвести свою проблему с помощью этого кода?

import java.awt.Color; 
import java.awt.Container; 
import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.*; 
import javafx.scene.text.*; 
import javax.swing.*; 

public class SwingJFXCombo { 

    public static Container initialize(){ 

     final JFXPanel fxPanel = new JFXPanel(); 
     JPanel jp = new JPanel(); 

     jp.add(fxPanel); 
     jp.setVisible(true); 
     // Really shouldn't do this, so commented it out 
     //jp.setPreferredSize(new Dimension(500, 300)); 
     jp.setBackground(Color.CYAN); 

     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       initFX(fxPanel); 
      } 
     }); 

     return jp; 
    } 

    private static void initFX(JFXPanel fxPanel) { 
     Scene scene = initScene(); 
     fxPanel.setScene(scene); 
    } 

    private static Scene initScene(){ 
     Group root = new Group(); 
     Scene scene = new Scene(root, javafx.scene.paint.Color.ALICEBLUE); 
     Text text = new Text(); 
     text.setX(40); 
     text.setY(100); 
     text.setFont(new Font(25)); 
     text.setText("Welcome JavaFX!"); 
     root.getChildren().add(text); 
     return (scene); 
    } 

    public static void main(String[] args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.add(SwingJFXCombo.initialize()); 
     frame.pack(); 
    } 
} 
+0

Во-первых, спасибо за ваш ответ Ник. Ну, ваш код работает для меня в SSCCE, но когда я попытался включить его в свое приложение, возникла одна и та же проблема. Это указывает на то, что проблема в другом месте моего кода, но что может быть тем, что предотвращает выполнение javafx? – Baya

+0

Я бы предложил поместить заявление печати в вызов 'Platform.runLater' и вызов' initialize', чтобы узнать, вызваны ли эти методы. Определение того, какие методы вызывают, а какие нет, было бы хорошим первым шагом. –

+0

Я поставил операторы печати, в которых вы сказали мне, в вызове 'initScene' и вызове' initFX', и кажется, что все методы получаются вызываемыми – Baya