問題から少し時間を取った後、何が起こっているのかを理解しました。
それはスタイルシートとHTMLEditorKitと関係があります。
次のサンプルcssを想定します。
body {
background-color: #ffff00}
次のコードは、これを新しいHTMLEditorKitインスタンスに単純にロードしてから、不透明でないhtmlラベルをパネルに追加します。
public class HTMLLabelTest extends JFrame {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
JFrame frame = new HTMLLabelTest();
frame.pack();
frame.setVisible(true);
}
});
}
public HTMLLabelTest() {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
HTMLEditorKit htmlEditorKit = new HTMLEditorKit();
StyleSheet styleSheet = new StyleSheet();
URL resource = getClass().getResource("/stylesheet.css");
styleSheet.importStyleSheet(resource);
htmlEditorKit.setStyleSheet(styleSheet);
JLabel label = new JLabel();
label.setText("<html><B>Some HTML Formatted</B> text</html>");
label.setOpaque(false);
label.setHorizontalAlignment(JLabel.CENTER);
label.setHorizontalTextPosition(JLabel.CENTER);
label.setPreferredSize(new Dimension(30,20));
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(label);
panel.setOpaque(true);
panel.setBackground(Color.WHITE);
add(panel);
setPreferredSize(new Dimension(300,200));
}
}
インポートされると、スタイルシートは、ラベルのレンダリングに使用されているものなど、HTMLEditorKitの後続のインスタンスで使用できるようになります。したがって、コードサンプルでは、不透明でないラベルは黄色の背景で表示されます。
例でスタイルをインストールする前にラベルを作成すると、ラベル(および後続のラベル)はスタイルを取得せず、必要に応じて不透明になりません。
私たちが抱えている問題は、アプリケーションを個別に起動することも、別のアプリ内から(同じjreで実行する)実行することもできることです。2番目のアプリの一部のユーザーは、アプリを起動する前にスタイルシートをインストールする画面にアクセスできます。このような場合、スタイルはデフォルトとしてロードおよび保存され、アプリですぐに使用できます。これが、一部のユーザーが問題を報告し、他のユーザーが報告しなかった理由です。
私はこれに対する最善の解決策をまだ決定していません。1つの可能性は、ラベルhtmlを作成するときに背景スタイルをオーバーライドすることでした。
<html><body bgcolor=\"red\">Test</body></html>
ただし、単色の代わりに「透明」を使用すると、スタイルシートの基になる色が代わりに表示されます。迷惑!