2

私はSwingを学んでおり、次のコードを持っています:

public class SimView {

private JFrame frame;
private JLabel background;
private JPanel car_panel;

public SimView() {

    frame = new JFrame("GUI");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 500);
    frame.getContentPane().setLayout(null);

    background = new JLabel("");
    background.setIcon(new ImageIcon(
            "C:\\Users\\D__\\Desktop\\background.png"));
    background.setBounds(0, 0, 384, 462);
    frame.getContentPane().add(background);
    frame.setVisible(true);

    car_panel = new JPanel();
    car_panel.setBounds(175, 430, 16, 21);
    car_panel.setVisible(true);
    car_panel.setBackground(Color.BLACK);
    background.add(car_panel);

    MoveCarRunnable carMover = new MoveCarRunnable(car_panel);

}

private static class MoveCarRunnable implements Runnable {

    private JPanel car;

    MoveCarRunnable(final JPanel car) {

        this.car = car;

    }

    @Override
    public void run() {
        // Should I call rePaint() on the car_panel here then ? 

    }

}

私がやりたいのは、「車」と呼ばれる JLabel の sy 座標を更新ごとに移動して、それ自体が移動する効果を得る、つまりユーザーの操作がないことです。これを行う方法がよくわかりません。更新ごとに JLabel の位置を再描画するある種の repaint() メソッドが必要だと思います。しかし、位置を更新する必要があることをこのクラスに知らせるにはどうすればよいでしょうか?

ポインタ(リンク/コード)をいただければ幸いです。この場合、単にソリューションを採用するのではなく、Swing とそのコンポーネントがどのように機能するかの概念を理解したいと思っていますが、もちろん、ソリューションに興味があるので、詳しく調べることができます。ありがとう

編集: 上記の編集コードを参照してください

4

2 に答える 2

4

Threadラベルの場所を変更する別のものを作成してから、コンテナーで and を呼び出す必要があります ( validate()) 。スレッド内に値を入れることを忘れないでください。repaint()frame.getContentPane()sleep()

ただし、別の を作成するためのより良いアプローチがありますJPanelpaintComponentその中でメソッドまたはメソッドをオーバーライドし、 spaintを移動する代わりに画像を描画しますJLabel

于 2012-11-21T13:24:37.083 に答える
1

JPanelレイアウトにラベルの代わりにa を追加することをお勧めします。JPanelすべての段階であなたの車を収容できるように、の寸法を選択してください。

paint次に、そのパネルのメソッドを上書きして、その上に画像を配置します。

于 2012-11-21T13:24:21.370 に答える