在我的Swing应用程序中,我需要支持渲染html。所以我在Swing应用程序中嵌入了一个JavaFX WebView。现在在一些html页面上,我使用新的html5 -Tag来播放视频。这在Windows和Linux上完美运行。但是在MacOS上我只能听到声音并看到黑色视频帧和底部的时间轨迹。
这是我从github获得的SSCCE。我刚刚将网址更改为包含html5视频标记示例的网址。如果MacOS用户可以试一试并告诉我你的计算机上是否会发生同样的情况,那就太棒了。当然,任何解决此问题的想法都会受到赞赏。
SSCCE:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.sun.javafx.application.PlatformImpl;
/**
* SwingFXWebView
*/
public class JavaFXTest extends JPanel
{
private Stage stage;
private WebView browser;
private JFXPanel jfxPanel;
private JButton swingButton;
private WebEngine webEngine;
private Object geo;
public JavaFXTest()
{
this.initComponents();
}
public static void main(final String... args)
{
// Run this later:
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
final JFrame frame = new JFrame();
frame.getContentPane().add(new JavaFXTest());
frame.setMinimumSize(new Dimension(640, 480));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
private void initComponents()
{
this.jfxPanel = new JFXPanel();
this.createScene();
this.setLayout(new BorderLayout());
this.add(this.jfxPanel, BorderLayout.CENTER);
this.swingButton = new JButton();
this.swingButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent e)
{
Platform.runLater(new Runnable()
{
@Override
public void run()
{
JavaFXTest.this.webEngine.reload();
}
});
}
});
this.swingButton.setText("Reload");
this.add(this.swingButton, BorderLayout.SOUTH);
}
/**
* createScene Note: Key is that Scene needs to be created and run on
* "FX user thread" NOT on the AWT-EventQueue Thread
*/
private void createScene()
{
PlatformImpl.startup(new Runnable()
{
@Override
public void run()
{
JavaFXTest.this.stage = new Stage();
JavaFXTest.this.stage.setTitle("Hello Java FX");
JavaFXTest.this.stage.setResizable(true);
final Group root = new Group();
final Scene scene = new Scene(root, 80, 20);
JavaFXTest.this.stage.setScene(scene);
// Set up the embedded browser:
JavaFXTest.this.browser = new WebView();
JavaFXTest.this.webEngine = JavaFXTest.this.browser.getEngine();
JavaFXTest.this.webEngine.load("http://camendesign.com/code/video_for_everybody/test.html");
final ObservableList<Node> children = root.getChildren();
children.add(JavaFXTest.this.browser);
JavaFXTest.this.jfxPanel.setScene(scene);
}
});
}
}
答案 0 :(得分:0)
这是一个半答案,可能会有所帮助: oracle website表示:“此时,64位体系结构无法使用在线安装和Java Update功能”
对我而言,这引起了很多问题,因为Java似乎是最新的,但实际上并非如此。在某些机器上,我可以通过手动更新Java 64bit VM来解决实际问题。然而,在Mac上,视频仍然没有播放,只有声音。
64位/ 32位问题变得更糟,因为双击jar可能会在64位JVM中启动它,但是通过控制台它可以在32位JVM中启动。因此,如果你在控制台中执行“java -version”,输出可能是“1.7.0 u45 32位”,但是一旦你通过双击启动jar,它就会在一个过时的64位JVM中启动。
因此,如果您遇到JavaFX问题(特别是使用UnsatisfiedLinkError)并且您拥有64位计算机,只需安装最新的64位java并希望它能解决问题。