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