Returning a value/string to a JTextField, IndexoutofboundsException

纵然是瞬间 提交于 2020-01-16 08:57:29

问题


Based upon another Headfirst exercise I'm having trouble with populating my GUI with the data of vehicles. I use a Controller class to manage my vehicle Object class. For some reason I'm getting an index out of range exception.

Gui Class

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());
        }
    }
}

Controller Class

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());
        }
    }
}

Vehicle Class

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; }
}

回答1:


Without more code it is not possible to tell where the error comes from. But from this piece of code, the only place an IndexOutOfBoundsException can com from is

return theVehicles.get(arrayPosition);

Your problem is, that arrayPosition is wrong.
Try debugging your code for finding out what exactly goes wrong, or post more code

Edit: You seem to have a misunderstanding on what the static keyword does.
static objects or methods are something, that is only instantiated once during runtime.
For example your declaration of the Cars attribute in class ShowhroomDriver means, that the class ShowroomDriver has a single class attribute named Cars (and by the way - do not let attributes start with an uppercase character. This is very confusing).

What you want though is to pass an instance of ShowRoom (your Cars attribute) to your class GuiInterface (also remove the static keyword there) via its constructor, like this:

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

Then, instead of

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

you write

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

Also remove all static keywords except the one at the main method.



来源:https://stackoverflow.com/questions/13324866/returning-a-value-string-to-a-jtextfield-indexoutofboundsexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!