2014-01-24 35 views
2

我试图将javaFX应用程序集成到Swing应用程序,并成功完成。JavaFX闪烁(重新粉刷这么晚)onmouseover与集成Swing

但问题是,我不能解决问题,当鼠标悬停按钮javaFX相关面板闪烁(重新绘制速度如此之慢)。

有没有解决方案,或者我会尝试将Swing整合到javaFX中?这将是烦人的。

private void initFX(JFXPanel fxPanel) throws IOException { 
    // This method is invoked on the JavaFX thread 
    scene = createScene(); 
    fxPanel.setScene(scene); 
} 

public MainFrame() { 

    Panel container = new Panel(); 
    container.setLayout(null); 
    try { 
     final JFXPanel panel = new JFXPanel(); 
     Insets insets = container.getInsets(); 
     container.add(panel); 

     JApplet mapApplet = (JApplet)Class.forName("samples.mainApp.MainApplet").newInstance(); 
     container.add(mapApplet); //Display Applet 
     add(container); 

     mapApplet.setBounds(800, 0, 566, 720); 
     panel.setBounds(0, 0, 800, 720); 

     mapApplet.init(); 
     mapApplet.start(); 

     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        initFX(panel); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } catch (InstantiationException | IllegalAccessException 
      | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    //button.setVisible(false); 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
private Scene createScene() throws IOException { 
      root = new Group(); 
      scene = new Scene(root, Color.ALICEBLUE); 
      Button btn1 = new Button("Connect"); 
      root.getChildren().addAll(btn1); 
} 
+0

尝试Java 8.使用Java 7有一些问题。 –

+0

哪些问题?你有什么参考? – totten

+1

只有在Java 7 + JavaFX重绘问题后才切换到Java 8(留下部分空白的菜单)。这个开关部分受到两个JavaFX版本之间差异的启发。我没有提及目前的事态。我必须承认,我正在研究Linux。因此,我的模糊评论。 –

回答

2

但问题是,我无法解析JavaFX的相关 面板闪烁问题(重绘这么慢),将鼠标悬停在按钮时。

有没有解决方案,或者我会尝试将Swing整合到javaFX中? 这将是烦人的

  • 从未见过,也不闪烁(不知道如何运行,从你的代码中模拟剪断贴在这里)

  • 为更好地帮助越早张贴SSCCE/MCVE,短,可运行,编译,造成与上午和描述问题(注意测试和查看SwingUtilities.invokeLater使用和Platform.runLater

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javax.swing.JApplet; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class JavaFX_And_Swing extends JApplet { 

    private final int WIDTH = 300; 
    private final int HEIGHT = 250; 
    private static JFXPanel fxContainer; 
    private static JFXPanel fxContainerTwo; 
    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } catch (Exception e) { 
       } 
       JFrame frame = new JFrame("JavaFX embeded in Swing"); 
       frame.setLayout(new BorderLayout(5, 5)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JApplet applet = new JavaFX_And_Swing(); 
       applet.init(); 
       frame.setContentPane(applet.getContentPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
       applet.start(); 
      } 
     }); 
    } 

    @Override 
    public void init() { 
     fxContainer = new JFXPanel(); 
     fxContainer.setPreferredSize(new Dimension(WIDTH/5, HEIGHT/5)); 
     add(fxContainer, BorderLayout.NORTH); 
     fxContainerTwo = new JFXPanel(); 
     fxContainerTwo.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     add(fxContainerTwo, BorderLayout.CENTER); 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       createScene(); 
       createScene2(); 
      } 
     }); 
    } 

    private void createScene() { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 
     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     Scene scene = new Scene(root, Color.BLUEVIOLET); 
     fxContainer.setScene(scene); 
    } 

    private void createScene2() { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World' Two"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 
     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     Scene scene = new Scene(root, Color.ALICEBLUE); 
     fxContainerTwo.setScene(scene); 
    } 
} 
+0

首先,我认为可能有太多组件的问题,但我只添加一个组件,一个按钮。同样的问题发生。顺便说一句,我尝试在同一个应用程序中使用swing应用程序和javafx面板。不是两个javafx面板。 – totten

+0

事情是JFrame和JavaFXPanel之间的JPanel。我明白,在Swing窗口和JavaFX组件之间不能有任何组件。谢谢您的回答。 – totten

+0

:-) +1奇怪的结果,再次仔细地用EDT为Swing和JavaFX – mKorbel