3

私のアプリケーションは JFrame 指向ではなく、出力に使用するだけです。ここで四角形を描画し、画面をクリアするように数百回指示できるようにする必要があります。これを行うために、メインに次のコードを書きました。私の理解では、JFrame 全体をきれいな青色の背景色にクリアする必要があります。

JFrame frame = new JFrame("Maze Master Premium Super-Deluxe V199.39");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int resolution = 20;
int frameWidth = horiz * resolution;
int frameHeight = vert * resolution;
frame.setMinimumSize(new Dimension(frameWidth, frameHeight));
frame.setSize(frameWidth, frameHeight);
frame.pack();
frame.setVisible(true);
frame.toFront();

Graphics g = frame.getGraphics();
g.setPaintMode();
g.setColor(Color.BLUE);
//Clear background
g.fillRect(0, 0, frameWidth, frameHeight);
frame.update(g);

しかし、これを実行すると、JFrame はデフォルトの明るい灰色の背景色で表示されます。クラスで JFrame を拡張する必要がありますか、それとも frame.update(g) を使用するだけで十分ですか?

4

1 に答える 1

3

あなたの質問から、あなたが何を達成しようとしているのかを正確に把握することは困難です。フレームの背景色を変更したいですか、それともカスタムペイントを実行したいですか?

これGraphics g = frame.getGraphics()は決して良い考えではありません。getGraphicsが戻る可能性があるという事実は別としてnull、グラフィックスはJavaでステートレスです。つまり、ペイントに使用するグラフィックスコンテキストは、ペイントサイクルごとに変わる可能性があるため、それへの参照に依存したり、維持したりしないでください。

間違ったアプローチは別として、aにはその上にレンダリングされるいくつかのコンポーネントが含まれているため、このメソッドが機能したとしても、フレームは実際には他のコンポーネント(およびそのコンテンツJFrame)で覆われているため、違いは見られません。JRootPaneペイン)

Componentカスタム塗装は、塗装方法の1つで実行する必要があります。

次の例では、いくつかの手法を使用して、フレームの内容を変更および更新します。

ここに画像の説明を入力してください

まず、コンテンツペインを独自のコンポーネントに置き換えます。これは常に必要ですが、フレームにカスタムペイントを行っているので、最も簡単でした。PaintPane同様の結果を得るには、フレームにを追加するだけで済みます。

次に、setBackgroundコンポーネントの背景を変更するために使用します。

paintComponent第三に、コンポーネントでカスタムペイントを実行するためにオーバーライドします。

public class SimplePaint01 {

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

    public SimplePaint01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.setContentPane(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private int angle = 0;
        private Rectangle shape = new Rectangle(0, 0, 100, 100);

        public PaintPane() {
            setBackground(Color.RED);
            Timer timer = new Timer(16, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    angle += 5;
                    repaint();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            int x = ((getWidth() - shape.width) / 2);
            int y = ((getHeight() - shape.height) / 2);

            shape.x = x;
            shape.y = y;

            g2d.setColor(Color.BLUE);
            g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(angle), x + (shape.width / 2), y + (shape.height / 2)));
            g2d.fill(shape);

            g2d.dispose();
        }

    }

}
于 2012-12-12T22:27:46.060 に答える