问题
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