Java-апплет не отображается в Chrome - PullRequest
0 голосов
/ 04 апреля 2011

Я сталкиваюсь с неким типом гонки в Java-апплете, свойственном Google Chrome (win xp).Я пишу тег <applet> во всплывающее окно.

Проблема характеризуется:

  1. Апплет всегда хорошо отображается в MS IE и Firefox .
  2. В Chrome Апплет отображает только 50% времени.
  3. Когда он не отображается, апплет на самом деле, кажется, работает беззвучно изконсоль Java!Без ошибок!
  4. Методы JApplet init() и start() всегда вызываются.
  5. isShowing() и isDisplayable() всегда возвращают true, даже когда апплетне отображается.
  6. Когда он не отображается, метод paint() не вызывается .
  7. Когда апплет не отображается, прозрачный прямоугольникобласть (цвета фона окна), где должен был находиться апплет, может быть замечена при выделении текста в окне.Отсюда я понимаю, что область апплета правильно размещена в окне.

Мой код:

MyApplet.java

  package mypackage;
  public class MyApplet extends JApplet  {
    public void init(){
      super.init();
      getContentPane().add(new JLabel("Hello"), BorderLayout.CENTER);
      System.out.println("init ok");
    }
    public void start() {
      super.start();
      System.out.println("s parent:"+this.getParent());
      System.out.println("s disp:"+this.isDisplayable());
      System.out.println("s showing:"+this.isShowing());      
    }
    public void paint(Graphics g){
      System.out.println("painting");
      super.paint(g);
    }
  }

test.html

<HTML>
<SCRIPT language='JavaScript'>
var jarpath='./myjar.jar';
var classname='mypackage.MyApplet';
function opentest(){
  applet=window.open('', '', "height=420,width=620");
  applet.document.write(
    '<html><body>'+
    '<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"'+
       'width=600 height=400>'+
        '<param name=code value="'+classname+'">'+
        '<param name=archive value="'+jarpath+'">'+
        '<param name=type value="application/x-java-applet;version1.3">'+
        '<COMMENT>'+
          '<EMBED code="'+classname+'" archive="'+jarpath+'" ' +
                  'type="application/x-java-applet;version=1.3" ' +
                  'width=600 height=400 ' +
              '>'+
            '<NOEMBED>' +
               'unavailable'+ 
            '</NOEMBED>'+
          '</EMBED>' +
        '</COMMENT>' +
     '</OBJECT>'+
   '</body></html>' );
}
</SCRIPT>

<BODY>
  Click here to open <A onclick="opentest()">Test</A>
</BODY>
</HTML>

Вывод с консоли

50% времени, когда я нажимаю «Тест», новое окно содержит метку «Привет».Другие 50% времени окно пустое, как описано.Вывод на консоль кажется идентичным, когда апплет загружается и не загружается.Кажется безупречным!

security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.definition value null
security: property package.definition new value com.sun.javaws
security: property package.definition value com.sun.javaws
security: property package.definition new value com.sun.javaws,com.sun.deploy
security: property package.definition value com.sun.javaws,com.sun.deploy
security: property package.definition new value com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.access value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.access new value sun.,com.sun.xml.internal.ws.,com.sun.xml.internal.bind.,com.sun.imageio.,com.sun.javaws,com.sun.deploy,com.sun.jnlp,org.mozilla.jss
security: property package.definition value com.sun.javaws,com.sun.deploy,com.sun.jnlp
security: property package.definition new value com.sun.javaws,com.sun.deploy,com.sun.jnlp,org.mozilla.jss
basic: Added progress listener: sun.plugin.util.GrayBoxPainter$GrayBoxProgressListener@137c60d
basic: Plugin2ClassLoader.addURL parent called for file:/E:/Java/eclipse/MyApplet/myjar.jar
network: Cache entry not found [url: file:/E:/Java/eclipse/MyApplet/myjar.jar, version: null]
network: Cache entry not found [url: file:/E:/Java/eclipse/MyApplet/myjar.jar, version: null]
basic: Applet loaded.
basic: Applet resized and added to parent container
basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 145396 us, pluginInit dt 331540 us, TotalTime: 476936 us
init ok
basic: Applet initialized
basic: Removed progress listener: sun.plugin.util.GrayBoxPainter$GrayBoxProgressListener@137c60d
basic: Applet made visible
basic: Starting applet
basic: completed perf rollup
s parent:sun.plugin2.main.client.PluginEmbeddedFrame[frame0,0,0,600x400,invalid,layout=java.awt.BorderLayout,title=,resizable,normal]
s disp:true
s showing:true
basic: Applet started
basic: Told clients applet is started

Обновление

Благодаря Ates при попытке следующего тайм-аута Апплет выглядит корректно 100% времени .

function opentest(){
  applet=window.open('', '', "height=420,width=620");
  setTimeout(function () {
    applet.document.write( ... ); } ,
    1000 );
}
  • Как упоминает Ates, теперь мы видим, что наше всплывающее окно не любит немедленных document.write s!
  • Это правильное поведение?Должен ли я ждать какой-то сигнал, прежде чем писать в документ?
  • Должен ли я поступить по-другому?Могу ли я добавить какого-нибудь слушателя, чтобы знать, когда безопасно звонить document.write()?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011
applet = window.open('', '', "height=420,width=620");
applet.document.write(...

Это может быть то место, где начинается ваше состояние гонки. Возможно, вы пытаетесь изменить документ вновь открытого окна без правильной инициализации окна. Быстрая вещь, которую нужно попробовать, - позволить текущему потоку JavaScript «дышать», отложив оставшуюся часть кода до фиктивного тайм-аута, который будет выполняться асинхронно:

applet = window.open('', '', "height=420,width=620");
setTimeout(function () {
    applet.document.write(...
}, 0);

Это не обязательно лучший способ решить эту проблему, но очень быстро попытаться выяснить, действительно ли это является источником состояния гонки.

1 голос
/ 04 апреля 2011

У меня были некоторые проблемы с блокировщиками рекламы, которые иногда не отображали мои апплеты. Хотя это работает 50/50 кажется странным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...