Swing でグラフィック処理 (線の描画など) を行うコツをつかもうとしています。これまでのところ、私が見たすべてのチュートリアルは をオーバーライドするクラスを宣言し、paintComponent
すべてのpaintComponent
メソッドは、赤い四角形を描画するなど、特定の設定を行います (ただし、毎回異なる場所に描画する可能性があります)。または、多数の線や図形を描画する場合でも、このpaintComponent
メソッドはすべてを一度に実行します。
私は理解しようとしています: コンポーネントにあるものを描画し、後で以前に描画したものを消去せずに、その上に別のものを描画したいとします。私が最初に考えたのは、
paintComponent
オーバーライドにコールバックを呼び出させることでした。
import java.awt.*;
import javax.swing.*;
public class DrawTest {
private interface GraphicsAction {
public void action (Graphics g);
}
private static class TestPanel extends JPanel {
private GraphicsAction paintAction;
public void draw (GraphicsAction action) {
paintAction = action;
repaint();
}
@Override
public void paintComponent (Graphics g) {
super.paintComponent (g);
if (paintAction != null)
paintAction.action(g);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame ("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500,500));
TestPanel p = new TestPanel ();
frame.getContentPane().add(p);
frame.pack();
frame.setVisible(true);
p.repaint();
p.draw (new GraphicsAction () {
public void action (Graphics g) {
g.setColor(Color.RED);
g.drawLine(5, 30, 100, 50);
}
});
// in real life, we would do some other stuff and then
// later something would want to add a blue line to the
// diagram
p.draw (new GraphicsAction () {
public void action (Graphics g) {
g.setColor(Color.BLUE);
g.drawLine(5, 30, 150, 40);
}
});
}
public static void main (String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGui();
}
});
}
}
これはうまくいきません。青い線は表示されますが、赤い線は表示されません。これは、青い線を引くとrepaint()
indraw
によってすべてが最初からやり直されるためだと思いますが、よくわかりません。paintComponent
とにかく、私は他にどのように呼び出されるのかわかりません
。
また、Thread.sleep(1000)
2 つの呼び出しの間に a を挿入するp.draw
と、赤い線が 1 秒も表示されません。そのため、必要なときにグラフィックを表示する方法がまったくわかりません。
Swing で「インクリメンタル グラフィックス」を検索しましたが、解決策を見つけるのに役立つものは何もありません。インクリメンタル グラフィックスを実現するためのメソッドのオーバーライドについて説明している Oracle の記事「Painting in AWT and Swing」をupdate()
見つけましたが、これが実際に行われた例は見つかりませんでした。
では、どうすればこれをやりたいことができるのでしょうか? それを行う簡単な方法があるべきであるほど一般的なタスクのように思えますが、私はそれを見つけていません。を呼び出さなくても実行できるはずだと思いますが
getGraphics
、これは、他の StackOverflow 応答に基づいて、せいぜい一種のゴーシュになります。