0

別のHeadfirst演習に基づいて、GUIに車両のデータを入力するのに問題があります。Controllerクラスを使用して、VehicleObjectクラスを管理しています。何らかの理由で、インデックスが範囲外の例外を取得しています。

GUIクラス

public class ShowroomDriver{
    public static Showroom Cars = new Showroom("Cars");
    public static void main(String[] args) {           
        Showroom Cars = new Showroom("Cars");
        Vehicle vechicle1 = new Vehicle("Ford"); 

        Cars.addVehicle(vechicle1);
        GuiInterface gui = new GuiInterface("Car Showroom");
    }

    private static class GuiInterface extends JFrame {
        private JButton saleButton, previousButton, nextButton;
        private static JTextField textField1;
        private JLabel label1;
        private JPanel[] p = new JPanel[5];
        public GuiInterface(String sTitle) {
            super(sTitle);
            setLayout(new FlowLayout());
            previousButton = new JButton("Previous Car");
            nextButton = new JButton("Next Car");
            saleButton = new JButton("Sale");          

            for(int i = 0; i < 5; i++){
                p[i] = new JPanel();
            }

            Container contentPane = getContentPane();
            contentPane.setLayout(new BorderLayout());
            JPanel formPanel = new JPanel(new GridLayout(1, 2));


            textField1 = new JTextField(10);            
            label1 = new JLabel("Manufacture");

            p[0].add(label1);
            p[1].add(textField1);


            for(int i = 0; i < 2; i++){
                formPanel.add(p[i]);
            }

            contentPane.add(formPanel, BorderLayout.CENTER);

            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(300,300);
            this.setResizable(false);
            this.setLocationRelativeTo(null);
            getField();

            this.setVisible(true);
        }

        private void getField(){
            textField1.setText(Cars.currentVehicle().getManufacutre());
        }
    }
}

コントローラクラス

public class Showroom{
    private ArrayList<Vehicle> vehiclesSold = new ArrayList();
    private ArrayList<Vehicle> theVehicles;
    private String vechicleType;
    private int arrayPosition = 0;

    public Showroom(String type){
        vechicleType = type;
        theVehicles = new ArrayList<Vehicle>();
    }

    public boolean addVehicle(Vehicle newVehicle){
        theVehicles.add(newVehicle);
        return true;
    }

    public Vehicle currentVehicle(){
        return theVehicles.get(arrayPosition);
    }

    public void getVehicles(){
        System.out.println("---Vehicle Type: " + vechicleType +"---");
        for(Vehicle nextVehicle : theVehicles){
            System.out.println(nextVehicle.toString());
        }
    }
}

車両クラス

public class Vehicle{
    private String Manufacture
    Vehicle(String Manufacture){ //There are more
        this.Manufacture = Manufacture;
        }
    }

    @Override
    public String toString(){
        String s = "Maufacture: " + getManufacutre()
                "\n";
        return s;
    }

    public String getManufacutre() { return this.Manufacture; }
}
4

1 に答える 1

1

これ以上のコードがないと、エラーの原因を特定できません。しかし、このコードから、IndexOutOfBoundsExceptioncancomからの唯一の場所は

return theVehicles.get(arrayPosition);

あなたの問題は、それarrayPositionは間違っているということです。
正確に何がうまくいかないかを見つけるためにコードをデバッグしてみるか、さらにコードを投稿してください

static編集:あなたはキーワードが何をするかについて誤解しているようです。
staticオブジェクトまたはメソッドは、実行時に1回だけインスタンス化されるものです。
たとえば、でのCars属性の宣言は、クラスに名前が付けられた単一のクラス属性があるclass ShowhroomDriverことを意味します(ちなみに、属性を大文字で始めないでください。これは非常に混乱します)。 ShowroomDriverCars

ShowRoomただし、必要なのは、次のように、コンストラクターを介して(Cars属性)のインスタンスをクラスに渡す(キーワードGuiInterfaceも削除する)ことです。static

// ...
private Showroom cars;
public GuiInterface(String sTitle, Showroom cars) {
    // ...
    this.cars = cars;
    // ...
}

次に、代わりに

private void getField(){
    textField1.setText(Cars.currentVehicle().getManufacutre());
}

あなたが書く

private void getField(){
    textField1.setText(this.cars.currentVehicle().getManufacutre());
}

また、メソッドのキーワードを除くすべての キーワードを削除します。staticmain

于 2012-11-10T18:35:34.643 に答える