2014-01-24 2 views
2

javaFX 애플리케이션을 Swing 애플리케이션에 통합하려고 시도했습니다.JavaFX가 깜박임 (최근에 다시 그리기) onmouseover with Swing

그러나 문제는 내가 버튼 마우스를 움직일 때 자바 FX 관련 패널 (느린 재 도장) 깜박이는 문제를 해결할 수없는,입니다.

어떤 해결책이 있습니까, 아니면 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

자바 7 + JavaFX가 문제를 다시 그리는 (부분적으로 빈 메뉴를 남겨둔) 후에 Java 8로 전환했습니다. 이 스위치는 부분적으로 JavaFX의 두 버전 간의 차이점에서 영감을 받았습니다. 나는 현재의 상태에 대한 언급이 없다. 그리고 나는 리눅스에서 일하고 있음을 인정해야한다. 그러므로 나의 막연한 논평. –

답변

2

는 그러나 문제는 내가 자바 FX는 패널이 깜박이는 관련 문제를 해결할 수있다 (느린 재 페인트).

어떤 해결책이 있습니까, 아니면 javaFX에 스윙을 통합하려고합니까? 성가 시게 될 것이다

.

  • 는 것을 볼 수 없으며, 깜박하지 빨리 SSCCE/MCVE이 짧은, 실행 가능한이 컴파일 가능한이 발생 게시 더 나은 도움을

  • (방법을 모르고하는 것은 여기에 게시 냈다 코드에서 시뮬레이션, 실행) 결코 오전 설명한 문제를

enter image description here

(테스트 SwingUtilities.invokeLater의 사용 및 Platform.runLater을 볼 수 있습니다)
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

첫째, 너무 많은 구성 요소에 문제가있을 수 있다고 생각하지만 버튼 하나만 추가합니다. 같은 문제가 발생합니다. BTW, 나는 같은 응용 프로그램에서 스윙 애플 리케이션과 javafx 패널을 사용하려고합니다. 아니 두 javafx 패널. – totten

+0

JFrame과 JavaFXPanel 사이의 JPanel입니다. 스윙 창과 JavaFX 구성 요소 사이에는 구성 요소가 없어야합니다. 답변 주셔서 감사합니다. – totten

+0

:-) +1 이상한 결과, 다시 신중하게 EDT for Swing 및 JavaFX – mKorbel