0

私は小さなプログラムを実行しましたが、解決策を見つけることができないというエラーが発生しました。

私の目的は、クリックをトリガーして作成されたオブジェクト( JPanel から拡張された BlockObject )をリスト( ArrayList を使用)に追加し、リストを読み取って画面に印刷できるようにすることでしたが、そのようなリストの読み取り時に私はArrayOutOfBoundsExceptionを取得します。

デバッグして問題の理由を見つけましたが、作成して追加した各オブジェクトが作成されたものではなく、最新のタイプ (前に説明) を取得する理由がわからないということです。

リストに沿って実行されるコードは

    public void ListBlock(){

    BlockObject auxb;
    Point auxp;

    for(int i = 0; i < list.size(); i++){
        auxb = list.get( i );

        if( auxb.getType() != 0 ){

            auxp = list.get( i ).limitBounds( 0, list.get( i - 1 ).getHeight() );
            auxb.setBounds( ( int ) auxp.getX(), ( int ) auxp.getY(), GlobalDataStorage.StatementWidth, GlobalDataStorage.StatementHeight );
        }
        add( auxb );
    }

}

問題は、それが常に if() 状態になるためであると述べたので、最初の要素でさえ前の要素を取得します ( OutOfBounds の原因です) が、ジャンプするタイプ 0 になる要素が各瞬間に既に内部に存在しますそれ、そして残りはそれに入ります:

   list = new ArrayList<BlockObject>();
    startingBlock = new BlockObject( 0 );

そこにある型は 0 ですが、先に説明したように変化します。

次の要素が追加されます。

    public void mouseClicked( MouseEvent evt ) {

        point = new Point( evt.getX(), evt.getY() );;

        if( ( findComponentAt( point ) instanceof BlockObject ) && ( StatementPanel.getType() != 0 ) ){

            list.add( new BlockObject( StatementPanel.getType() ) );

            ListBlock();
            revalidate();
            repaint();

        }

    }

BlockObject作成時のタイプは変数に保存され、変更されないはずなので、各作成は値とともにリストに保存されると思っていましたが、StatementPanelで新しいリーフが作成されたときに以前に作成されたすべてのオブジェクトを変更し続けますそれが選択されています(StatementPanelはJTreeに続いて実装され、各リーフは異なるタイプです)。おそらくそれはタイプを取得するための静的メソッドでしたが、別のものを追加しても機能しませんでした。

多分問題は明白で、私には見えません。

4

1 に答える 1

1

私はあなたがこの問題を抱えていると仮定します:

Example e = new Example();
e.ChangeValue("e");
List<Example> examples = new List<Example>();
examples.add(e);
e.ChangeValue("e2");
examples.add(e);

これの問題は、リストに e を追加すると、オブジェクトへの参照が作成されるだけで、リストに追加された両方が同じ参照を指していることです (したがって、一方を変更すると他方も変更されます)。これに対する解決策は Create新しいオブジェクトに新しい例を作成し、その値をそれにコピーします。そうすれば、参照の問題が発生せず、一度に1つだけ変更できます

于 2012-12-01T21:14:29.423 に答える