QA@IT

JRE7でappletを動かすとIMEの変換候補を表示した時にモーダルダイアログが隠れる

3689 PV

下記の条件と手順で、IMEの変換候補ウィンドウが表示されるたびに、次の現象が発生します。
Windows 7ではモーダルダイアログがブラウザの裏に隠れ、変換候補ウィンドウだけが取り残されます。
Windows 8ではモーダルダイアログが点滅します。恐らく一瞬だけブラウザの裏に隠れるのではないかと思います。

Javaのバグかもしれませんが、いつ改善されるか分からないので、回避策をご存じの方がいらっしゃれば教えて頂きたく存じます。

環境

全ての組み合わせではありませんが、次の環境で発生しています。

  • JRE7(update 17まで全て)
  • Windows 8 の場合、IE10 と Microsoft IME 2012
  • Windows 7 の場合、IE9、IE10、Firefox19 と Microsoft Office IME 2010、Microsoft Office IME 2007

逆に、Windows 7で「Microsoft IME」や「Google 日本語入力」を使うと発生しませんし、JRE6でも発生しません。

準備

後述の「サンプルアプレット」、「アプレット起動用HTML」、「build.xml」を同じフォルダに置きます。

antが使えれば antを実行します。
antが使え無ければ、「サンプルアプレット」をコンパイルしてclassファイルを作成します。作成したclassファイルを全て含んだtest.jarファイル作成をします。

再現手順

再現しなくなった場合、ブラウザでリロードをしてください。
まずは「アプレット起動用HTML」をブラウザで開きます。

パターン1
  1. 「open」メニューから「Modal Dialog」を選択してモーダルダイアログを開きます。
  2. モーダルダイアログのテキストフィールドに日本語を入力し、変換候補ウィンドウを出します。
  3. 問題の現象が発生します。
パターン2
  1. ボタン「open」をクリックします。
  2. モーダルダイアログのテキストフィールドに日本語を入力し、変換候補ウィンドウを出します。
  3. 問題の現象は発生しません。
パターン3
  1. 「open」メニューをクリックします。(メニューアイテム「Modal Dialog」はクリックしません)
  2. ボタン「open」をクリックします。
  3. モーダルダイアログのテキストフィールドに日本語を入力し、変換候補ウィンドウを出します。
  4. 問題の現象が発生します。
パターン4
  1. コンボボックスをクリックします。
  2. ボタン「open」をクリックします。
  3. モーダルダイアログのテキストフィールドに日本語を入力し、変換候補ウィンドウを出します。
  4. 問題の現象が発生します。

サンプルアプレット

import java.awt.Dialog;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


public class TestApplet extends JApplet implements ActionListener {

  public void init() {
    this.setContentPane(new JPanel());

    JMenuBar bar = new JMenuBar();
    JMenu menu = new JMenu("Open");
    JMenuItem item = new JMenuItem("Modal Dialog");

    item.addActionListener(this);
    menu.add(item);
    bar.add(menu);

    this.setJMenuBar(bar);

    JButton button = new JButton("open");
    button.addActionListener(this);
    this.getContentPane().add(button);

    JComboBox combo = new JComboBox(new String[]{"あ","い"});
    this.getContentPane().add(combo);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    Window owner = SwingUtilities.windowForComponent(this);
    String title = "Modal Dialog";
    SomeDialog dialog =
        new SomeDialog(owner, title, Dialog.ModalityType.APPLICATION_MODAL);
    dialog.setLocationRelativeTo(this);
    dialog.setVisible(true);
  }


  private class SomeDialog extends JDialog {
    public SomeDialog(Window owner, String title, ModalityType modalityType) {
      super(owner, title, modalityType);
      init();
    }

    private void init() {
      final JTextField text = new JTextField();
      this.add(text);
      addWindowListener(new WindowAdapter() {
        public void windowOpened(WindowEvent we) {
          text.requestFocus();
        }
      });
      text.requestFocus();
      this.pack();
    }

  }
}

アプレット起動用HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
TestApplet
</title>
</head>

<body bgcolor="silver" TOPMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
<!--
<applet code="TestApplet.class" archive="test.jar" codebase="applet"
  width="500" height="500">
</applet>
-->
<table height="100%" width="100%" border="1">
<tr><td height="20%" width="100%">
HTML テーブル
</td></tr>
<tr><td>
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" name="Appt1"
 width="100%" height="100%" hspace="0" vspace="0" align="left">
<PARAM name="java_code" value="TestApplet.class">
<PARAM name="java_type" value="application/x-java-applet;version=1.3">
<PARAM name="java_archive" value="test.jar">
<COMMENT>
<EMBED type="application/x-java-applet;version=1.3" name="Appt1" width="100%" height="100%" hspace="0" vspace="0" align="left"
 java_code="TestApplet.class"
 java_archive="test.jar">
<NOEMBED>
      <p>Unable to start plugin.</p>
</NOEMBED>
</COMMENT>
</OBJECT>
</td></tr>
</table>
</body>
</html>

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="build" default="to_jar">
  <target name="to_jar">
    <javac srcdir="./">
    </javac>
    <jar basedir="./"
      jarfile="./test.jar"
      includes="*.class"
    />
  </target>
</project>

回答

回答ありがとうございます。

Windows XP、IE8、Microsoft Office IME 2010でも再現することを忘れていました。
また、Aeroを無効にしてみましたが、現象は変わりませんでした。

編集 履歴 (0)

再現環境作るのが億劫なので考察だけですが。
7190922 の理由的は多分ネイティブにアクセスしている部分が 7以降(多分Vistaも)に大幅に変更されたためだと思われます。

Windows Aero等をoffにしてみると正常な動作になるかも。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。