web-dev-qa-db-ja.com

JFrameを拡張せずにgetGraphics()を使用してオブジェクトを描画する

JFrameを拡張する)クラスなしでオブジェクトを描画するにはどうすればよいですか? getGraphicsメソッドを見つけましたが、オブジェクトを描画しません。

import javax.swing.*;
import Java.awt.*;
public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new JPanel();
        frame.add(panel);

        Graphics g = panel.getGraphics();
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}
9
user2110286

コンポーネントの描画方法を変更する場合(長方形を追加する場合)、そのコンポーネントでpaintComponent()を再定義する必要があります。コードでは、getGraphics()を使用しています。

コンポーネントでgetGraphics()を呼び出さないでください。 (返されたGraphicsに対して)行うペイントは一時的なものであり、次回Swingがコンポーネントを再ペイントする必要があると判断したときに失われます。

代わりに、(JComponentまたはJPanelの)paintComponent(Graphics)メソッドをオーバーライドし、受け取ったGraphicsオブジェクトを使用して、このメソッドでペイントを行う必要があります引数として。

詳細については このリンク を確認してください。

以下は修正済みのコードです。

import javax.swing.*;
import Java.awt.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(0, 0, 100, 100);
            }
        };
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    }
}

別のバージョンでは、まったく同じことを実行しますが、あなたにはより明確かもしれません:

import javax.swing.*;
import Java.awt.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(600, 400);

        JPanel panel = new MyRectangleJPanel(); // changed this line
        frame.add(panel);

        // Graphics g = panel.getGraphics();
        // g.setColor(Color.BLUE);
        // g.fillRect(0, 0, 100, 100);

        frame.validate(); // because you added panel after setVisible was called
        frame.repaint(); // because you added panel after setVisible was called
    }
}

/* A JPanel that overrides the paintComponent() method and draws a rectangle */
class MyRectangleJPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}
21
acdcjunior

JPanelクラスのpaintComponentメソッドをオーバーライドする必要があります。したがって、JPanelを拡張するクラスを作成し、サブクラスのpaintComponentメソッドをオーバーライドする必要があります

4
olyanren

Java.awt.image.BufferedImage


Java.awt.image.BufferedImageのインスタンスを使用しないのはなぜですか?例えば.

BufferedImage output = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = output.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, output.getWidth(), output.getHeight());
g2.setColor(Color.BLUE);
g2.fillRect(0, 0, 100, 100);

JOptionPane.showMessageDialog(null, new ImageIcon(output));
2
Paul Vargas