0

現在、JEditorPane に画像 (Jlabel 付き) を表示しようとしています。私は Swixml とフォーム レイアウトで作業しています。JLabel と JEditorPane を同じ場所に配置しました。したがって、「setVisible」をtrueまたはfalseに設定するだけで、画像が表示されます。

これまでのところ、すべて順調です。しかし、誰かが JEditorPane でテキストを選択しようとすると、ここで醜いことが起こります:バグのイラスト

私はいくつかのことを試します:

  1. JEdi​​torPane を無効にします。

    選択範囲が表示されなくても、テキストは JLabel に表示されます。

  2. 塗り直し :

    JLabelを再描画すると、再び前面に押し出されますが、表示されないようにするために(50ミリ秒ごとに1回など)繰り返し実行する必要があります。

    また、選択範囲を再描画しようとしましたが、うまく機能しません。場合によっては無視されるか、速度が低下し、それでも醜いです

  3. 最後のアイデアは、JLabel が displayer のときに JEditorPane にマウスが入らないようにすることでしたが、MouseEnter イベントでは、EditorPane からポイントを取得できず、JEditorPane の外の適切な場所にカーソルを置くのが難しくなりました...

setComponentZOrder を試してみましたが、うまく機能させることができませんでした (確かに誤用しました) が、描画順序を変更するだけなので、問題を解決できるとは思いません (最後に描画されるのは Java で一番上にあります)。 )、しかし、それは明らかに再描画の問題です。

Java 1.6 を使用せざるを得ないことを指摘しておくと便利です (Java 1.7 と 1.8 で使用しなければならない同一の名前のクラスとの競合、Sun の変更ログは 1.9 での修正について述べています ...)

コンテキストはアプレットです。理解できない場合 (英語は母国語ではありません)、遠慮なく訂正して質問してください。

助けてくれてありがとう!

4

2 に答える 2

2

DefaultHighlighter を見てみましょう。JEdi​​torPaneはそれを使用してselecton(ハイライト)をレンダリングします。メソッドがあります

public void paint(Graphics g) {
    // PENDING(prinz) - should cull ranges not visible
    int len = highlights.size();
    for (int i = 0; i < len; i++) {
        HighlightInfo info = highlights.elementAt(i);
        if (!(info instanceof LayeredHighlightInfo)) {
            // Avoid allocing unless we need it.
            Rectangle a = component.getBounds();
            Insets insets = component.getInsets();
            a.x = insets.left;
            a.y = insets.top;
            a.width -= insets.left + insets.right;
            a.height -= insets.top + insets.bottom;
            for (; i < len; i++) {
                info = highlights.elementAt(i);
                if (!(info instanceof LayeredHighlightInfo)) {
                    Highlighter.HighlightPainter p = info.getPainter();
                    p.paint(g, info.getStartOffset(), info.getEndOffset(),
                            a, component);
                }
            }
        }
    }
}

ご覧のとおり、すべてのハイライトがペイントされます。

JEdi​​torPane のハイライト ペインタ (DefaultHighlighter のインスタンス) を拡張機能に置き換えることができます。paint() メソッドをオーバーライドし、Graphics インスタンスにカスタム クリップを追加します。クリップには、JLabel 長方形が差し引かれた現在のクリップに基づくカスタム形状が必要です。

于 2014-09-26T08:54:41.697 に答える
0

Overlap Layoutを作成してみました。塗装の問題に気づきました。マウス イベントに応答するコンポーネントを使用します。

最後の段落で、私は次のように述べました。

JButton を使用している場合、マウスで入力されたイベントにより、重なり合ったボタンが他のボタンの上に描画され、各コンポーネントのレンダリングが混乱することに気付きました。この問題がある場合の解決策はisOptimizedDrawingEnabled()、JPanel のメソッドをオーバーライドして return にすることfalseです。これにより、コンポーネントがオーバーラップしていることを再描画サブシステムに伝え、描画の問題を適切に解決できるようにします。

たぶん、これはあなたの場合にも役立ちます。

于 2014-09-25T14:10:14.703 に答える