1

JLabelを作成し、MigLayoutレイアウトマネージャーを使用してパネルに追加するための次の非常に単純なコードがあります。

MigLayout layout = new MigLayout();
JPanel panel = new JPanel(layout);
panel.setBackground(Color.GRAY);
JLabel label = new JLabel("<html><h3>Some Text</h3></html>");
panel.add(label, "growx,w 220!,h 40!,top");

これにより、ラベルが透明になり、パネルの背景がラベルの後ろに表示されます。これが、必要な動作です。

ただし、一部のPCでは、ラベルは白一色の背景でレンダリングされます。つまり、opaque=trueが設定されているかのように表示されます。

不思議なことに、ラベルテキストがhtmlを使用してフォーマットされていない場合、これは問題ではありません。

JLabel label = new JLabel("Some text");

UIデリゲートとしてBasicLabelUIを使用しているので、ここで標準のペイント動作が見られると思います。

これは、WindowsXPでjre1.6.0_30を使用して実行されています。誰かが以前にこのようなものを見たことがありますか?さまざまなマシンで実行されているグラフィックハードウェアの違いと関係があるのでしょうか。

4

2 に答える 2

2

問題から少し時間を取った後、何が起こっているのかを理解しました。

それはスタイルシートと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>

ただし、単色の代わりに「透明」を使用すると、スタイルシートの基になる色が代わりに表示されます。迷惑!

于 2012-10-05T09:10:02.423 に答える
1

すべてのペイントがComponentUIのインスタンス、つまりルックアンドフィールに委任されているため、JLabelがオーバーライドされていないという事実は関係ありません。これは環境によって異なります。

于 2012-08-30T12:14:58.057 に答える