目立つものがいくつかあります...
問題"
すでに述べたように、画像描画プロセスに可変引数を指定する必要があります。 g.drawImage(img2, x, y, this);
、これにより、画像をペイントする場所を定義できます。
を実装Runnable
している間、実際にはそれを呼び出すスレッドを開始していません。これは、実際には何も変数を変更していないことを意味します。
あなたstart
のメソッドでは、のようなものを呼び出す必要がありますnew Thread(this).start()
。
推奨事項
質問にSwingのタグを付けましたが、AWTコンポーネントを使用しています。これはお勧めしません(実際、アプレットは面倒なのでお勧めできません-私見)。もう1つの問題は、すぐにわかるように、ダブルバッファリングされていないことです。これは、通常、アニメーションの実行時にちらつきを引き起こしますが、これは望ましくありません。
paint
補足として、のようなトップレベルのコンテナのメソッドをオーバーライドすることもお勧めしませんApplet
。トップレベルのコンテナには多くの追加コンポーネントが含まれている傾向がありpaint
ます。このようなメソッドをオーバーライドすると、この設定が破棄されます。また、トップレベルのコンテナもダブルバッファリングされる傾向はありません。
以下の例では、を使用してJFrame
いますが、を使用するように変換するのにそれほど時間はかかりませんJApplet
(これをドロップするだけAnimationPanel
です。これが、トップレベルのコンテナからの拡張が一般的に推奨されないもう1つの理由です;)
public class AnimatedBoat {
public static void main(String[] args) {
new AnimatedBoat();
}
public AnimatedBoat() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new AnimationPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class AnimationPane extends JPanel {
private BufferedImage boat;
private int xPos = 0;
private int direction = 1;
public AnimationPane() {
try {
boat = ImageIO.read(new File("boat.png"));
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
xPos += direction;
if (xPos + boat.getWidth() > getWidth()) {
xPos = getWidth() - boat.getWidth();
direction *= -1;
} else if (xPos < 0) {
xPos = 0;
direction *= -1;
}
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return boat == null ? super.getPreferredSize() : new Dimension(boat.getWidth() * 4, boat.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int y = getHeight() - boat.getHeight();
g.drawImage(boat, xPos, y, this);
}
}
}