0
私は線を作成したい、2秒後に別の線を壊すなどしたい。 もし私が行を描画し、Thread.sleep()でプログラムの実行を一時停止し、paintComponent()メソッド内で再び線を描画すると、最初にプログラムが2秒間停止してから、両方の線が同時に描画されます。 この問題を解決するにはどうすればよいですか?一度にすべてではなく時間がたつにつれて図形を1つずつ描画する
私は線を作成したい、2秒後に別の線を壊すなどしたい。 もし私が行を描画し、Thread.sleep()でプログラムの実行を一時停止し、paintComponent()メソッド内で再び線を描画すると、最初にプログラムが2秒間停止してから、両方の線が同時に描画されます。 この問題を解決するにはどうすればよいですか?一度にすべてではなく時間がたつにつれて図形を1つずつ描画する
これは現実的な一貫性の要件と問題です。基本的な問題の解決方法に関する基本的な情報は、Concurrency in SwingとHow to use Swing Timersをご覧ください。
また、あなたが集中したいコア設計の選択肢があるSwingで
をどのように絵画作品の詳細については、Painting in AWT and SwingとPerforming Custom Paintingを見ている必要があります:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private List<Shape> shapes;
private int yPos = 0;
public TestPane() {
shapes = new ArrayList<>(25);
Timer timer = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
yPos += 10;
Line2D line = new Line2D.Double(0, yPos, getWidth(), yPos);
shapes.add(line);
repaint();
}
});
timer.setInitialDelay(2000);
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();
for (Shape line : shapes) {
g2d.draw(line);
}
g2d.dispose();
}
}
}
をペイントするために必要な情報を提供するために、1つ以上のモデルに依存しなければならないことはゲームループで、可能な限り論理的な意思決定に焦点を当てべきではありません。 –
私は知っています。私はこれらのことをC++ Sfmlライブラリで作業していました。しかし、スイングでは、私は別のパラメータ(例えば、パラメータとして描く線なし)でゲームループ内で何度もJPanelオブジェクトを作成する必要がありますか? –
パネルを再作成する必要はありませんが、paintComponent()を呼び出すたびにシーン全体が再描画されます。タイミングは、paintComponent()メソッド内から行う必要があります。 – James