0

JScrollPane のバーをスクロールすると、(常にではありませんが) ときどき、一部のコンポーネント (通常は JLabels などのテキスト) が適切に再描画されず、部分的にしかレンダリングされないことがあります。

これがなぜなのかわかりません。AdjustmentListener 内で paint() を呼び出してみましたが、効果がないようです。

何か案は?

編集: コンポーネントの初期化

    panel = new JPanel();
    ImageIcon img = new ImageIcon("editor.png");
    setIconImage(img.getImage());
    initComponents();

    final JScrollPane pane = new JScrollPane(panel);
    this.setContentPane(pane);
    //pane.setLayout(new ScrollPaneLayout());
    //pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    Dimension dim = panel.getSize();
    dim.height = dim.height - 100;
    pane.setSize(dim);
    this.setSize(dim);
    AdjustmentListener hListener = new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            repaint();
            for(Component c : panel.getComponents())
                c.repaint();
            for(Component c : pane.getComponents())
                c.repaint();
            panel.repaint();
            panel.revalidate();
            pane.repaint();
            pane.revalidate();
        }
    };
    pane.getVerticalScrollBar().addAdjustmentListener(hListener);
    panel.setVisible(true);
    pane.setVisible(true);
4

1 に答える 1

8

これらの基本原則のいずれかに違反すると、レンダリングアーティファクトが発生する可能性があります。

  • Swing GUIオブジェクトが、イベントディスパッチスレッドでのみ構築および操作されることを確認します。

  • 不透明度プロパティを尊重するようにしてください。特に、デフォルトでは不透明でJLabelはありません。

  • 「SwingプログラムはオーバーライドpaintComponent()するのではなくオーバーライドする必要がありますpaint()。」— <a href="http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks"rel="nofollownoreferrer">ペイントAWTとSwingの場合:ペイント方法

補遺:これらの口述を組み込んだこの関連するJLabelは、アーティファクトなしで何千もの点滅するインスタンスをスクロールします。

于 2012-07-09T04:21:00.830 に答える