2012-07-13 3 views
-4

나는 이것이 믿을 수 없을 정도로 일반적인 문제이며 매우 매우 철저히 보였지만 운이 없었 음을 알고있다. outOfBounds 예외 문제가있는 것 같습니다. 내 코드는 바로 뒤에 wuth 오류가 다음과 같습니다! 다시 한 번 감사드립니다 :)java.lang.IndexOutOfBoundsException : 인덱스 : 6, 크기 : 6 JAVA, ARRAY

업데이트 : 많은 빠른 답변을 보내 주셔서 감사합니다. Analysis Panel에 문제가 있다고하지만 문제가없는 다른 클래스를 사용하고 있기 때문에 이것이 원인인지 정확히 알지 못했습니다. 그러나 아래에 다른 코드가 있습니다. 다시 한 번 감사드립니다!

public class AnalysisPanel extends JPanel { 

private JTextArea overview_text = GuiComponentGenerator.getJTextArea(""); 

private JTextArea csv_text = GuiComponentGenerator.getJTextArea(""); 

private JComboBox analyser_choices; 

private String[] analyser_class_names; 

private LinkedHashMap<String, ImageAnalysis> analyser_outputs = new LinkedHashMap(); 

private JTextField[] weka_directory_texts; 

private JTextField[] weka_tag_texts; 

private JTextField weka_output_file_path_text = GuiComponentGenerator 
     .getJTextField(""); 

private JTextField weka_relation_text = GuiComponentGenerator 
     .getJTextField(""); 

public AnalysisPanel() { 
    GuiComponentGenerator.setLook(this); 
    analyser_class_names = ResourceAndClassDirectories 
      .getClassNamesInDirectory(ResourceAndClassDirectories.IMAGE_ANALYSERS_CLASS_STEM); 
    ArrayList<String> choices = new ArrayList(
      Arrays.asList(analyser_class_names)); 
    choices.add(0, "All"); 
    analyser_choices = GuiComponentGenerator.getJComboBox(choices); 
    analyser_choices.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent e) { 
      updateTextBoxes(); 
     } 
    }); 
    setLayout(new BorderLayout()); 
    add(BorderLayout.NORTH, 
      GuiComponentGenerator.getJPanel(analyser_choices)); 
    add(BorderLayout.CENTER, getTextsPanel()); 
    add(BorderLayout.SOUTH, getWekaPanel()); 
} 

private JPanel getWekaPanel() { 
    JPanel weka_panel = GuiComponentGenerator.getJPanel(new BorderLayout()); 
    JPanel details_panel = GuiComponentGenerator.getJPanel(new GridLayout(
      6, 1)); 

    JPanel top_panel = GuiComponentGenerator 
      .getJPanel(new GridLayout(1, 2)); 
    JPanel left_top_panel = GuiComponentGenerator.getJPanel(new BorderLayout()); 
    JPanel right_top_panel = GuiComponentGenerator.getJPanel(new BorderLayout()); 
    left_top_panel.add(BorderLayout.WEST, GuiComponentGenerator.getJLabel("Relation:")); 
    left_top_panel.add(BorderLayout.CENTER, weka_relation_text); 
    right_top_panel.add(BorderLayout.WEST, GuiComponentGenerator.getJLabel("Output to:")); 
    right_top_panel.add(BorderLayout.CENTER, weka_output_file_path_text); 
    top_panel.add(left_top_panel); 
    top_panel.add(right_top_panel); 
    weka_panel.add(BorderLayout.NORTH, top_panel); 

    weka_directory_texts = new JTextField[5]; 
    weka_tag_texts = new JTextField[5]; 

    JPanel labels_panel = GuiComponentGenerator.getJPanel(new GridLayout(1, 
      2)); 
    labels_panel.add(GuiComponentGenerator.getCentreAlignedJLabel("Tag")); 
    labels_panel.add(GuiComponentGenerator 
      .getCentreAlignedJLabel("Image directory")); 
    details_panel.add(labels_panel); 
    for (int pos = 0; pos < 5; pos++) 
     details_panel.add(getDetailsPanel(pos)); 

    weka_panel.add(BorderLayout.NORTH, top_panel); 
    weka_panel.add(BorderLayout.CENTER, details_panel); 
    JPanel weka_bordered_panel = GuiComponentGenerator 
      .getLeftBorderedJPanel(weka_panel, "Weka"); 
    return weka_bordered_panel; 
} 

private JPanel getDetailsPanel(int pos) { 
    JPanel details_panel = GuiComponentGenerator.getJPanel(new GridLayout(
      1, 2)); 

    final JTextField weka_directory_text = GuiComponentGenerator 
      .getJTextField(""); 
    JTextField weka_tag_text = GuiComponentGenerator.getJTextField(""); 

    weka_directory_texts[pos] = weka_directory_text; 
    weka_tag_texts[pos] = weka_tag_text; 

    JPanel right_panel = GuiComponentGenerator 
      .getJPanel(new BorderLayout()); 
    right_panel.add(BorderLayout.CENTER, weka_directory_text); 

    JButton choose_directory_button = GuiComponentGenerator 
      .getJButton(GuiComponentGenerator.FILE_DIALOG_ICON); 
    right_panel.add(BorderLayout.EAST, choose_directory_button); 

    choose_directory_button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent arg0) { 
      File directory = FileChooserDialog.getFile(
        ResourceAndClassDirectories.SOURCE_DIRECTORY, "", true); 
      if (directory != null) 
       weka_directory_text.setText(directory.getPath()); 
     } 
    }); 

    details_panel.add(weka_tag_text); 
    details_panel.add(right_panel); 

    return details_panel; 
} 

public String[] getWekaRunDetails() { 
    String[] wrd = { weka_relation_text.getText(), 
      weka_output_file_path_text.getText() }; 
    return wrd; 
} 

public ArrayList<String[]> getWekaImageDetails() { 
    ArrayList<String[]> image_details = new ArrayList(); 
    for (int pos = 0; pos < 5; pos++) { 
     String[] details = { weka_directory_texts[pos].getText(), 
       weka_tag_texts[pos].getText() }; 
     image_details.add(details); 
    } 
    return image_details; 
} 

private JPanel getTextsPanel() { 
    JPanel texts_panel = GuiComponentGenerator 
      .getJPanel(new BorderLayout()); 
    csv_text.setRows(3); 
    csv_text.setFont(new Font("Courier", Font.PLAIN, 14)); 
    texts_panel.add(BorderLayout.NORTH, GuiComponentGenerator 
      .getLeftBorderedJPanel(
        GuiComponentGenerator.getJScrollPane(csv_text), "CSV")); 
    texts_panel.add(BorderLayout.CENTER, GuiComponentGenerator 
      .getLeftBorderedJPanel(
        GuiComponentGenerator.getJScrollPane(overview_text), 
        "Overview")); 
    return texts_panel; 
} 

public String getChosenImageAnalyser() { 
    return (String) analyser_choices.getSelectedItem(); 
} 

public void performAnalyses(final TaggedBufferedImage tbi) { 
    Thread thread = new Thread() { 
     public void run() { 
      analyser_outputs.clear(); 
      String choice = (String) analyser_choices.getSelectedItem(); 
      csv_text.setText(""); 
      if (choice.equals("All")) { 
       for (String analyser_class_name : analyser_class_names) 
        performAnalysis(analyser_class_name, tbi); 
      } else 
       performAnalysis(choice, tbi); 
      updateTextBoxes(); 
     } 
    }; 
    thread.start(); 
} 

private void updateTextBoxes() { 
    String overview = ""; 
    String csv_headings = "|"; 
    String csv_values = "|"; 
    String choice = (String) analyser_choices.getSelectedItem(); 
    for (String analyser_class_name : analyser_class_names) { 
     if (choice.equals("All") || choice.equals(analyser_class_name)) { 
      ImageAnalysis image_analysis = analyser_outputs 
        .get(analyser_class_name); 
      if (image_analysis != null) { 
       overview += analyser_class_name + "\n\n" 
         + image_analysis.overview + "\n-----------------\n"; 
       System.out.println("In Analysis Panel: image analsis csv headings " + image_analysis.csv_headings.size()); 
       for (int pos = 0; pos < image_analysis.csv_headings.size(); pos++) { 
        String heading = image_analysis.csv_headings.get(pos); 
        String value = image_analysis.csv_values.get(pos); 
        while (heading.length() < value.length()) 
         heading += " "; 
        while (value.length() < heading.length()) 
         value += " "; 
        csv_values += value + "|"; 
        csv_headings += heading + "|"; 
       } 
      } 
     } 
    } 
    overview_text.setText(overview); 
    csv_text.setText(csv_headings + "\n" + csv_values); 
} 

private void performAnalysis(String analyser_class_name, 
     TaggedBufferedImage tbi) { 
    try { 
     overview_text.setText("Analysing " + analyser_class_name); 
     Class c = Class 
       .forName(ResourceAndClassDirectories.IMAGE_ANALYSERS_CLASS_STEM 
         + "." + analyser_class_name); 
     ImageAnalyserInterface analyser = (ImageAnalyserInterface) c 
       .newInstance(); 
     ImageAnalysis image_analysis = analyser.analyseImage(tbi); 
     analyser_outputs.put(analyser_class_name, image_analysis); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

은}

업데이트 : 문제가 아래에 있었지만 지금 작업, 그것은 파일 자체 색상이 변경 될 필요가!

모두 감사합니다 :)

+2

많은 코드가 있습니다. 끝까지 어디로 가야합니까? Java 배열이 0 기반이라는 사실을 고려하고 있습니까? 그것은 pp1 + 1 라인입니까? –

+1

모든 루프가 첫 번째 인덱싱이 된 이유는 무엇입니까? –

+1

실제로 예외를 트리거하는 행은 무엇입니까? 오류 메시지는 줄 번호를 나타내지 만 그 줄 번호는 볼 수 없습니다. – Lanaru

답변

8

의 배열에 따라서 5 그것이 인덱싱 제로로 5는 최종 지수 것 - 즉 , 0,1,2,3,4,5는 6 개 요소입니다.

9

은 그럼 당신은 크기 6의 배열에 인덱스 6에 액세스하려고하는 제목이 인덱스 0에서 자바 실행에 배열부터 크기 일 수 없습니다 기반. 배열의 6 개 요소, 다음 인덱스가있을 경우

내 최대 가능한 인덱스 크기 제

+0

예 1 ~ 6의 배열을 실행하는 것이 좋다고 생각합니다. 배열을 참조 할 때 배열 [pos -1]을 참조하십시오. 개인적인 취향이라 생각합니다! 하지만 고마워요. – redrubia

+1

자네가 원한다면 루프는 1 크기에서 실행될 수있어, 배열에 접근 할 때 0 기반 배열로 접근한다. –