(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);
}
}
コンポーネントの描画方法を変更する場合(長方形を追加する場合)、そのコンポーネントで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);
}
}
JPanelクラスのpaintComponentメソッドをオーバーライドする必要があります。したがって、JPanelを拡張するクラスを作成し、サブクラスのpaintComponentメソッドをオーバーライドする必要があります
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));