1

コーディングを再開したばかりで、ダブルバッファリングの方法を忘れていたようです。これは私が今持っているコードで、何が欠けているのかわかりません。開始すると、楕円形ではなく、白い画面だけが表示されます。

レンダリングの間違いは何ですか?

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;

public class Graphs extends JFrame {

private Image dbImage;
private Graphics dbg;

public static void main(String[] args) {
    new Graphs();
}

public Graphs() {
    setSize(1000, 600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setTitle("Graphs");
    setLocationRelativeTo(null);
    setVisible(true);
}

public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    dbg.drawImage(dbImage, 0, 0, this);
}

public void paintComponent(Graphics g) {
    g.drawOval(200, 200, 200, 200);
    repaint();
}
}

更新: コンパイル エラー@Override

The method  paintComponent(Graphics) of type Graphs must override or implement a supertype method.

1 quick fix available:
-> Remove '@Override' annotation
4

2 に答える 2

5

楕円形が表示されないのは、画像を独自のGraphicsオブジェクトに描画しているためです。交換:

dbg.drawImage(dbImage, 0, 0, this);

g.drawImage(dbImage, 0, 0, this);

またpaint、最上位のコンテナでオーバーライドするのではなくpaintComponent、サブクラスのコンテナでオーバーライドすることをお勧めしJComponentます。電話も忘れずに

super.paintComponent(g);
于 2013-01-24T01:56:05.387 に答える
3
  1. paint最上位
    コンポーネント ( などJFrame)のメソッドをオーバーライドすることは避ける必要があります。JComponent
  2. 電話をしsuper.paintないのは非常に悪いことです。基本的に、フレームがその子コンポーネントをペイントできないようにしました...
  3. メソッド内で画像をロードしないでくださいpaint。将来の再描画が遅くなります
  4. repaintどのメソッドからも呼び出さないpaintXxxでください。ペイントの無限ループが作成され、CPU サイクルが急速に消費されます。
  5. JFrameメソッドはありませんpaintComponent
  6. メソッドを介してJComponent( などの)カスタム ペインティングを実行することをお勧めします。JPanelpaintComponent

例で更新

ここに画像の説明を入力

public class BadPaint10 {

    public static void main(String[] args) {
        new BadPaint10();
    }

    public BadPaint10() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private BufferedImage background;

        public PaintPane() {
            try {
                background = ImageIO.read(new File("C:/Users/shane/Dropbox/pictures/436px-Work_with_exotic_creatures.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);

                x = (getWidth() - 200) / 2;
                y = (getHeight() - 200) / 2;
                g.setColor(Color.RED);
                g.drawOval(x, y, 200, 200);

            }

        }
    }
}

すでに述べたように、優先順位は重要です。要素がペイントされる順序は結果に影響します。

あなたは見つけるかもしれません

使える。

于 2013-01-24T01:55:58.747 に答える