我正在使用Java创建一个加载和显示X3D模型的应用程序,我已经下载了所有正确的jars
并将它们放在项目中,我可以看到每个类每个jars
都包含。但是,当我在NetBeans中运行我的代码时,我收到以下错误:
No skin defined in xj3d-skin.properties
Producing default properties.
Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.j3d.aviatrix3d.ViewEnvironment.<init>()V from class org.j3d.aviatrix3d.surface.BaseRenderingProcessor
at org.j3d.aviatrix3d.surface.BaseRenderingProcessor.<init>(BaseRenderingProcessor.java:223)
at org.j3d.aviatrix3d.surface.RenderingProcessor.<init>(RenderingProcessor.java:49)
at org.j3d.aviatrix3d.surface.SimpleAWTSurface.<init>(SimpleAWTSurface.java:95)
at org.web3d.ogl.browser.X3DBrowserJPanel.<init>(X3DBrowserJPanel.java:264)
at org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:249)
at org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:252)
at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:43)
at xj3dtest.Xj3DTest.main(Xj3DTest.java:59)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
我在时间点为项目提供的java代码如下所示:
package xj3dtest;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;
public class Xj3DTest extends JFrame {
public Xj3DTest(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Setup browser parameters
HashMap requestedParameters=new HashMap();
requestedParameters.put("Antialiased",TRUE);
requestedParameters.put("TextureQuality","MEDIUM");
requestedParameters.put("PrimitiveQuality","MEDIUM");
requestedParameters.put("Xj3D_InterfaceType","SWING");
requestedParameters.put("Xj3D_NavbarShown",TRUE);
requestedParameters.put("Xj3D_NavbarPosition","TOP");
requestedParameters.put("Xj3D_LocationShown",TRUE);
requestedParameters.put("Xj3D_LocationPosition","TOP");
requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
requestedParameters.put("Xj3D_ShowConsole",TRUE);
requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
requestedParameters.put("Xj3D_StatusBarShown",TRUE);
requestedParameters.put("Xj3D_FPSShown",TRUE);
requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
requestedParameters.put("Xj3D_Culling_Mode", "frustum");
System.setProperty("x3d.sai.factory.class", "org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl");
X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);
Browser browser = x3dComponent.getBrowser();
Component browserComponent = (Component) x3dComponent.getImplementation();
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(browserComponent, BorderLayout.CENTER);
X3DScene scene = browser.createX3DFromURL(new String[] {"test.x3dv"});
browser.replaceWorld(scene);
}
public static void main(String[] args) {
Xj3DTest frame = new Xj3DTest("Xj3D test");
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
正如您从我收到的错误消息中可以看到的那样,我得到了java.lang.IllegalAccessError
的异常,我想知道如何修复它。感谢。
修改
以下列表是我正在使用的所有罐子。
aviatrix3d-all
aviatrix3d-all_2.2.0
aviatrix3d-core
aviatrix3d-glsl
aviatrix3d-utils
dis-enums
gnu-redexp-1.0.8
httpclient
j3d-org-all_3.0.0-nps
jogl_old
uri
vecmath
vlc_uri
xj3d-common_2.0.0
xj3d-config_
xj3d-core_2.0.0
xj3d-ecmascript_2.0.0
xj3d-external-sai_2.0.0
xj3d-j3d
xj3d-java-sai_2.0.0
xj3d-jaxp_2.0.0
xj3d-net
xj3d-norender_2.0.0
xj3d-ogl
xj3d-parser_2.0.0
xj3d-render_2.0.0
xj3d-runtime
xj3d-runtime_2.0.0
xj3d-sai_2.0.0
xj3d-sav_2.0.0
xj3d-script-base
xj3d-script-base_2.0.0
xj3d-xml_2.0.0
编辑#2
我已完成修改并已下载xj3d-2.1 installer
并将其放入库中并将其放入项目中。我的代码如下所示。
package xj3dtest;
import java.awt.BorderLayout;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;
public class Xj3DTest extends JFrame {
public Xj3DTest(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Setup browser parameters
HashMap requestedParameters=new HashMap();
requestedParameters.put("Antialiased",TRUE);
requestedParameters.put("TextureQuality","MEDIUM");
requestedParameters.put("PrimitiveQuality","MEDIUM");
requestedParameters.put("Xj3D_InterfaceType","SWING");
requestedParameters.put("Xj3D_NavbarShown",TRUE);
requestedParameters.put("Xj3D_NavbarPosition","TOP");
requestedParameters.put("Xj3D_LocationShown",TRUE);
requestedParameters.put("Xj3D_LocationPosition","TOP");
requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
requestedParameters.put("Xj3D_ShowConsole",TRUE);
requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
requestedParameters.put("Xj3D_StatusBarShown",TRUE);
requestedParameters.put("Xj3D_FPSShown",TRUE);
requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
requestedParameters.put("Xj3D_Culling_Mode", "frustum");
System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");
X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);
Browser browser = x3dComponent.getBrowser();
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);
X3DScene scene = browser.createX3DFromURL(new String[] {"test.x3dv"});
browser.replaceWorld(scene);
}
public static void main(String[] args) {
Xj3DTest frame = new Xj3DTest("Xj3D test");
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
我现在得到的运行时错误是:
Feb 27, 2016 10:00:03 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Exception in thread "main" java.lang.IllegalArgumentException: BrowserConfig: PrimitiveQuality must be low, medium or high
at org.xj3d.sai.BrowserConfig.initialize(BrowserConfig.java:355)
at org.xj3d.sai.BrowserConfig.<init>(BrowserConfig.java:240)
at org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:211)
at org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:263)
at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:42)
at xj3dtest.Xj3DTest.main(Xj3DTest.java:56)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
答案 0 :(得分:0)
好的,我想我已经有了一些工作。
看起来您的代码是为了与Xj3D 1一起编写的。我对代码进行了一些修改以使其与Xj3D 2一起使用。首先,将调用System.setProperty
的行更改为以下内容:
System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");
进行此更改的想法取自here。
其次,参数TextureQuality
,PrimitiveQuality
和Xj3D_AntialiasingQuality
的值必须是小写的,而不是现在的大写。
第三,事实证明,X3DComponent
调用返回的BrowserFactory.createX3DComponent
是JPanel
的子类,因此可以直接添加到Container
无需致电getImplementation()
。删除行
Component browserComponent = (Component) x3dComponent.getImplementation();
并替换
行 cp.add(browserComponent, BorderLayout.CENTER);
与
cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);
最后,您需要使用以下五个JAR,所有这些JAR都是由xj3d-2.1安装程序提供的,可以从here下载:
进行这些更改后,我可以使用您的Xj3DTest
类来查看X3D文件。我没有test.x3dv
文件,因此我使用了the X3D file on Wikipedia。你的课似乎对我有用 - 我在Windows 10 x64上使用Java 1.8.0_60 x64,如果这有帮助 - 但它没有问题:
jogamp_exe_tstNUMBERS.exe
进程,每个进程运行大约一分钟。两分钟后出现以下消息(省略异常堆栈跟踪):
SEVERE: Native code library (32 and 64 bit library) failed to load: java.lang.UnsatisfiedLinkError: no odejava in java.library.path
如果你能找到odejava库的二进制版本,那么你做得比我好。不过,该计划似乎没有它。
在窗口打开之前,以下消息会多次出现。同样,我不确定为什么,但他们似乎没有任何伤害:
Message: Attempting to make GL context current again in order to initialise the surface
Error: The GL context failed to initialise for some mysterious reason
程序没有彻底退出:关闭窗口后,我必须从Process Explorer中删除java.exe进程。