1

ああ。バグがわかりました。もちろん、それはとてつもなく単純でした。MovingPanelItem の下のオーバーライドされた更新は、次のように記述する必要があります。

@Override
public void update( int x, int y )
{
    xCoord = xCoord + getxStep();
    yCoord = yCoord + getyStep();
}

完全開示: これは宿題です。

問題: キー リスナー イベントごとに、画面が更新され、移動オブジェクトが移動する必要があります。現在、オブジェクトは最初に表示されますが、指定されたキーを押すとオブジェクトが消えます。

また、すべての PanelItem は ArrayList (別のクラス) に格納されます。MovingPanelItem のサブクラスではないすべてのオブジェクトは、KeyEvent 時に画面に残ります。

私は想像力に多くを任せていることを知っているので、より詳細が必要な場合はお知らせください.

スーパークラス:

public class PanelItem
{
    private Image img;
    protected int xCoord;
    protected int yCoord;
    protected int width;
    protected int height;

    //constructor
    public SceneItem( String path, int x, int y, int w int h )
    {
         xCoord = x;
         yCoord = y;
         setImage( path, w, h );
    }

    public void SetImage( String path, int w, int h )
    {
        width = w;
        height = h;
        img = ImageIO.read(new File(path));
    }

    //to be Overriden
    public void update( int width, int height )
    {

    }

}

サブクラス:

public class MovingPanelItem extends PanelItem
{
    private int xStep, yStep;

    // x & y correspond to the coordinate plane
    // w & h correspond to image width and height
    // xs & ys correspond to unique randomized 'steps' in the for the x and y values

    public MovingSceneItem(String path, int x, int y, int w, int h, int xs, int ys)
    {
        super( path, x, y, w, h);
        setxStep(xs);
        setyStep(ys);
        update( x, y );
    }


    @Override
    public void update( int x, int y )
    {
        this.xCoord = x + getxStep();
        this.yCoord = y + getyStep();
    }
}

(Eels への回答) パネル/ウィンドウ自体は、次のクラスに含まれています。

public class Panel extends JPanel {
    protected ArrayList<PanelItem> panelItems;
    private JLabel statusLabel;
    private long randomSeed;
    private Random random;

    public Panel(JLabel sl) {
        panelItems = new ArrayList<PanelItem>();
        statusLabel = sl;
        random = new Random();
        randomSeed = 100;
    }

    private void addPanel() {
        addPanelItems(10, "Mouse");
    }

    private void addPanelItems(int num, String type) {
        Dimension dim = getSize();
        dim.setSize(dim.getWidth() - 30, dim.getHeight() - 30);

        synchronized (panelItems) {
            for (int i = 0; i < num; i++) {
                int x = random.nextInt(dim.width);
                int y = random.nextInt(dim.height);

                if (type.equals("Person")) {
                    int xs = random.nextInt(21) - 10;
                    int ys = random.nextInt(21) - 10;
                    panelItems.add(new Mouse(x, y, xs, ys));
                 }
             }
             repaint();
         }
    // causes every item to get updated.
    public void updatePanel() {
        Dimension dim = getSize();
        synchronized (panelItems) {
            for (PanelItem pi : panelItems) {
                pi.update(dim.width, dim.height);
            }
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        synchronized (panelItems) {
            for (PanelItem pi : panelItems) {
                pi.draw(g);
            }
        }
    }
}

テストクラス内の KeyListener クラス:

private class MyKeyListener extends KeyAdapter
{
    @Override public void keyTyped(KeyEvent e)
    {
        if(e.getKeyChar() == 'f') {
            panel.updatePanel();
            panel.repaint();
        }

        // other key events include reseting the panel &
        // creating a new panel, both of which are working.
    }
}

上記のコード内で、私が変更できる唯一のコード (および私が書いた唯一のコード) は、サブクラスの MovingPanel アイテムです。

4

0 に答える 0