我有一个在浏览器中运行的java applet,它调用一些javascript函数并期望从这些函数中得到结果.这适用于以下配置:
但它不适用于MAC OS上的Firefox
问题的根源似乎是始终返回null的win.eval调用.我在Mac OS X 10.4.11上使用Firefox 3.0.6进行了测试
一点代码:
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("testfunc()");
System.out.println("exp = " + exp.toString());
Run Code Online (Sandbox Code Playgroud)
这会触发java.lang.NullPointerException(exp.toString())语句.testfunc javascript函数只返回true.
我尝试使用win.call并得到了相同的结果.
我的applet标记包含mayscript和scriptable属性.
我找到答案感谢特里斯坦.测试他的解决方案我创建了一个非常简单的测试,可以工作并以我的方式找到罪魁祸首.我确信我用一个空的testfunc()做了我的测试,它刚刚返回true,但我可能没有,因为在那种情况下它会起作用.这里真正的问题是该函数称为applet的公共方法.Liveconnect似乎无法在Firefox Mac中处理这种情况.
让我给你举个例子 :
Java类:
public class MyApplet extends Applet {
public int getMyValue() {
return 5;
}
public void somefunction() {
JSObject win = (JSObject) JSObject.getWindow(this);
Object exp = win.eval("jsfunc()");
System.out.println("exp = " + exp.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
和javascript代码:
function jsfunc() {
var myApplet = document.getElementById("applet_id");
return myApplet.getMyValue() + …Run Code Online (Sandbox Code Playgroud) 我发现Gmail.com使用Flash 很奇怪,因为Flash 在网络上被认为是糟糕的(在很多方面).
Gmail使用Flash的原因是什么?
为什么不使用Java Applet或Javascript实现该功能?

当我的applet第一次从干净的环境启动时,事情按照我期望的方式工作.我产生了两个线程,一个用于通用处理,一个用于图形.我从事件调度线程执行所有GUI操作调用.从appletviewer正确处理启动/停止,但不重启/重新加载.我drawCanvas在Applet的内容窗格中将Canvas称为唯一的Component,我使用双缓冲来绘制它.
我在这里观察问题:
public void start() {
/* ... some stuff */
executeOnEDTAndWait(
new Thread() {
@Override
public void run() {
/* ... more stuff ... */
setupDrawCanvas();
if( drawCanvas.isDisplayable() ) {
drawCanvas.createBufferStrategy(2);
/* ... some more stuff */
} else {
/* This is where it runs into difficulties */
}
/* ... */
Run Code Online (Sandbox Code Playgroud)
在哪里setupDrawCanvas定义如下:
private void setupDrawCanvas() {
setVisible(false);
setIgnoreRepaint(true);
getContentPane().removeAll();
drawCanvas = new Canvas();
drawCanvas.setName("drawCanvas");
drawCanvas.setSize(
newDrawCanvasDimension.width,
newDrawCanvasDimension.height);
drawCanvas.setIgnoreRepaint(true);
getContentPane().add(drawCanvas);
getContentPane().setVisible(true);
drawCanvas.setVisible(true);
setVisible(true);
} …Run Code Online (Sandbox Code Playgroud) 在我的书(我的计算机科学课程)中,他们有源代码片段.我们谈论的是图形编程和applet.我注意到在某些情况下他扩展了JApplet,而在其他情况下他使用了Applet.
我想知道差异是什么,以及它们将如何影响代码?
最近,我的任务是创建一个图形化的刽子手游戏,其中用户试图猜测计算机的单词.我应该使用JApplet还是Applet(我们大多使用JApplet,这就是为什么我倾向于这个,但我可以去任何一种方式).
此外,我想知道applet中的基本过程应该是什么,有些人确实将所有代码放在扩展JApplet或JFrame的单个文件中.我应该这样做吗?
Java是我们拥有的最佳托管运行时技术之一.它具有非常高性能的VM,可以实现接近C的性能.高质量的开源库的数量是任何其他平台无法比拟的.然而,尽管它是第一个出现在浏览器(Applet)中的动态客户端技术,但它现在还没有被广泛使用.Java的哪些缺点使得人们使用JavaScript + HTML5或Flash/Flex而不是Java来实现RIA?我为什么要使用它们尽管它们对Java程序员来说不是那么令人愉快?
我正在尝试创建一个Applet加载器,我需要在显示的Applet上绘制,但我似乎无法找到一种方法来做到这一点.
我最初的理解是Applet,通过扩展Component就像任何常规的java.awt.Component一样,可以在Container中添加,只有覆盖paint方法,但它似乎不起作用.
在我的初始化代码中,我创建了一个java.awt.Frame,我在其上添加了我的java.awt.Container的自定义实现,它覆盖了所有的paint方法,以便它们在x:5,y:5处填充rect,大小为w:10 ,h:10调用父方法后
但是,当添加小程序时,无论在所有内容之上绘制什么,它总是如此
public class AppletTest {
public static void main(String[] args) {
Frame frame = new Frame("Applet Test!");
Container container = new Container() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void paintAll(Graphics g) {
super.paintAll(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void print(Graphics g) {
super.print(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void printComponents(Graphics g) …Run Code Online (Sandbox Code Playgroud) 我有这个测试应用程序:
import java.applet.*;
import java.awt.*;
import java.net.URL;
public class Test extends Applet
{
public void init()
{
URL some=Test.class.getClass().getClassLoader().getResource("/assets/pacman.png");
System.out.println(some.toString());
System.out.println(some.getFile());
System.out.println(some.getPath());
}
}
Run Code Online (Sandbox Code Playgroud)
当我从Eclipse运行它时,我收到错误:
java.lang.NullPointerException
at Test.init(Test.java:9)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
类路径(来自.CLASSPATH文件)
<classpathentry kind="src" path="src"/>
Run Code Online (Sandbox Code Playgroud)
在我的c:\ project\src文件夹中,我只有Test.java文件和包含pacman.png的'assets'目录.
我做错了什么以及如何解决?
这适用于Applet,Servlet,Midlet等的子类.
为什么他们不需要main()?如果我想创建一个Craplet始于类init()或类似的东西,它是不好的设计,不然我怎么会去这样做呢?
我已经阅读了很多这方面的文章/解释,花了太多时间,但一切都太宽泛或具体.
这个问题实际上只适用于我制作的Applet.它包含一个Class,并且需要2个其他Jar库.我已将这些包含在项目中(多个项目,因为我在Netbeans和Eclipse中尝试过这个...很容易重新创建一个Class项目).所有这一切的要点是我的HTML/web项目不应该处理多个Jar或引用它们.它根本不是一个复杂的applet /项目.
最初,我是在Netbeans中制作的.它有主包,在添加2个Jars后,它们被放在"Libraries"区域("resources"文件夹)中.在构建它之后,Netbeans为我的一个包/类创建一个Jar,然后将另外两个库放在它旁边的"lib"目录中.我希望他们在一个可分发的罐子里.从我看过的很多东西中,我尝试将以下内容放在build.xml中:
<target name="YourBigJar" depends="-post-jar">
<jar destfile="dist/BigJar.jar">
<zipfileset src="dist/cxapplet.jar"/>
<zipfileset src="resources/dpotapi.jar"/>
<zipfileset src="resources/dpotjni.jar"/>
</jar>
</target>
Run Code Online (Sandbox Code Playgroud)
但它什么都没产生.我从NetBeans获得了这个- 在一个jar中部署所有内容.我不知道/不了解如何使用build.xml,所以如果出现问题(显然)我不会感到惊讶,但我没有收到任何错误/警告消息.
当我在Eclipse中创建它时,它有效地组合了它们,但是当我在实际的Web项目中使用Jar时,它说它无法从其他2个Jars中找到类.我不明白如何解决它,但它是一个Classpath问题?在Eclipse中,我创建一个名为"lib"的新目录并将Jars放入其中.然后,我右键单击该项目,转到"Java Build Path",然后添加Jars,同时在"Order and Export"选项卡下检查它们.从我读过的东西,我右键单击项目,选择"导出",选择"Jar",取消选中".classpath"和".project"文件,只检查"导出生成的类文件和资源",然后允许它生成清单文件.就像我说的,这会生成一个Jar,但它的内容是我的包,然后是一个"lib"目录,其中包含另外两个Jars.Manifest就在那里,但它很空,并没有引用任何文件(不确定这是否重要).当我把它放在我的网络应用程序中时,它说applet无法找到其他类.
它看起来很简单 - 一个包/类,两个外部Jars ......在构建为applet时可以组合成一个Jar.有任何想法吗?
更新:
自从我们开始使用Maven以来,有人开始使用Maven插件.所以我们最终创建了一个新的项目来容纳applet(因为它用于多个项目),并在我们pom.xml的最终使用它:
<build>
<resources>
<resource>
<directory>${basedir}/applet</directory>
<excludes>
<exclude>codesignstore</exclude>
</excludes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>cxapplet</finalName>
<archive>
<index>true</index>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
<id>make-my-applet-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>1.2</version> …Run Code Online (Sandbox Code Playgroud) 我有几种用于编写(繁体中文)台湾人的输入方法,它们与Windows 7一起提供.此外,所有输入方法都有一个选项来切换字符宽度(单字节/双字节字符).
如果我在Java应用程序中选择其中一个输入方法并将字符宽度设置为半角(单字节字符模式),我可以在JTextField中成功输入文本.但是,如果应用程序显示一些对话框(例如JOptionPane)或弹出窗口,则输入法字符宽度将自动更改为全角(双字节字符模式).之后,用户必须手动切换到半角字符.
我可以使用Java类"InputContext"以编程方式打开或关闭输入方法,但是我无法控制输入方法是否设置为全宽/半宽(单/双字节)字符模式.
我想也许可以从Windows输入法设置中禁用它,但是没有与字符宽度的自动切换相关的选项.
问题是:有没有办法处理(禁用)这种自动切换?
以下是使用上述输入方法对此进行测试的示例代码:
public class Example implements ActionListener {
JFrame f = new JFrame("pasod");
JTextField txt = new JTextField();
Button btn = new Button("Locale");
public Example() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout());
btn.addActionListener(this);
panel.add(btn);
panel.add(txt);
f.add(panel);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setSize(800, 100);
f.setVisible(true);
}
public static void main(String[] args) {
new Example();
}
public void actionPerformed(ActionEvent arg0) …Run Code Online (Sandbox Code Playgroud)