0

私は Java JRE 1.6.7 を使用していて、JComponent と JScrollPane を持っていました。これでダブルバッファリングが機能せず、常にちらつきが発生しました。Canvas を使用した場合はバッファリングを処理しましたが、JScrollPane と組み合わせて使用​​すると問題が発生しました。

そこで、これらの問題の 1 つが修正されることを期待して、JRE 1.6.18 をダウンロードしました。さて、JScrollPane 内の JComponent がまったく正しく描画されません。JScrollPane が境界線を除いてその上に描画されているかのように、JComponent の外側の領域のみを描画します。

描画されていないコードの例を次に示します。これにより、描画が行われる領域の 1 ピクセル幅の白いアウトラインが生成されます。

public void paint(Graphics arg0) {



Graphics2D graphics = (Graphics2D) arg0;

  graphics.setColor(Color.WHITE);
  graphics.fillRect(0, 0, (int) getWidth(), (int) getHeight());

どんな助けでも大歓迎です!-クレイグ

4

3 に答える 3

2

進歩しているように見えますが、チュートリアルの例もご覧になることをお勧めします。

MartijnCourteauxの分析は正しいです。オーバーライドする必要がありますpaintComponent()。また、AWTコンポーネントとSwingコンポーネントを混在させることはお勧めできません。両方のアイデアは、AWTとSwingのPaintingで説明されています。

スクロールしてもちらつきは発生しません。これは、コンポーネントのグリッドをスクロールし、背景にチェッカーボードをペイントする例です。

import java.awt.*;
import javax.swing.*;

public class Scrolling extends JFrame {

    private static final int MAX = 8;
    private static final int SIZE = 480;
    private static final Color light = new Color(0x40C040);
    private static final Color dark  = new Color(0x408040);

    private static class MyPanel extends JPanel {

        public MyPanel() {
            super(true);
            this.setLayout(new GridLayout(MAX, MAX, MAX, MAX));
            this.setPreferredSize(new Dimension(SIZE, SIZE));
            for (int i = 0; i < MAX * MAX; i++) {
                this.add(new JLabel(String.valueOf(i), JLabel.HORIZONTAL));
            }
        }

        @Override
        public void paintComponent(final Graphics g) {
            int w = this.getWidth()/MAX;
            int h = this.getHeight()/MAX;
            for (int row = 0; row < MAX; row++) {
                for (int col = 0; col < MAX; col++) {
                    g.setColor((row + col) % 2 == 0 ? light : dark);
                    g.fillRect(col * w, row * h, w, h);
                }
            }
        }
    }

    public Scrolling() {

        this.setLayout(new BorderLayout());
        final MyPanel panel = new MyPanel();
        final JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.getHorizontalScrollBar().setUnitIncrement(16);
        scrollPane.getVerticalScrollBar().setUnitIncrement(16);
        this.add(scrollPane, BorderLayout.CENTER);
        this.pack();
        this.setSize(SIZE - SIZE / 3, SIZE - SIZE / 3);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
    }

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Scrolling().setVisible(true);
            }
        });
    }
}
于 2010-02-03T01:36:51.677 に答える
2

paintComponent(Graphics g)の代わりにからオーバーライドを作成してみてくださいpaint(Graphics g)。paintComponent は、costum 描画のためにオーバーライドする必要があるメソッドです。

白い四角形が見えるかどうか、赤など、よく見えるものを使用してみてください。

于 2010-02-02T18:36:37.477 に答える
1

わかりました、私はわずかな答えを思いついた。電話する代わりに

scrollPane.add(containerCanvas);

私は呼んでいます

new JScrollPane(containerCanvas);

これはある意味で機能します。ただし、現在はJScrollPaneバーが表示されないようになっています。理由はわかりませんが、現在調査中です。しかし、少なくともコンポーネントは再び描画されています。

于 2010-02-02T19:26:20.087 に答える