0

根据另一个 Headfirst 练习,我在用车辆数据填充我的 GUI 时遇到了麻烦。我使用 Controller 类来管理我的车辆 Object 类。出于某种原因,我得到了一个超出范围异常的索引。

桂班

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

如果没有更多代码,就无法判断错误来自何处。但是从这段代码中,唯一的地方IndexOutOfBoundsException可以来自

return theVehicles.get(arrayPosition);

你的问题是,这arrayPosition是错误的。
尝试调试您的代码以找出究竟出了什么问题,或发布更多代码

编辑:您似乎对static关键字的作用有误解。
static对象或方法是在运行时只实例化一次的东西。
例如,您对Cars属性的声明class ShowhroomDriver意味着该类ShowroomDriver具有一个名为的类属性Cars(顺便说一下 - 不要让属性以大写字符开头。这非常令人困惑)。

您想要的是将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 回答