2011-11-18 6 views
0

나는 완전히 손실되었다. 커스텀 FileNode 클래스를 포함하는 Vector of TreePath를 통과하는 메소드를 가지고 있으며 마지막 노드에 포함 된 File을 추출합니다. 결과는 Vector의 모든 파일 이름의 인쇄 된 목록입니다. 나는 그것을 통해 증가하는 for 루프를 가지고 있었지만 잘 작동했지만 여러 페이지를 가질 수 있도록 while 루프로 변경했습니다. 이제는 어떤 이유로 지난 11 개의 파일 만 인쇄합니다.루프에서 자바 그래픽 drawString 호출의 이상한 동작

나는 그 원인을 알아 냈지만, 왜 또는 어떻게 수정해야하는지 모르겠습니다. 나는 'lineCount'와 'printPaths.size()'콘솔에 인쇄하기 위해 줄을 추가했고, lineCount가 55를 올릴 때까지 증가했다가 15로 되돌아 가면서 계속 증가하는 것을 발견했다. 이름은 실제로 15로 되돌릴 때까지 인쇄를 시작하지 않았습니다.

나는 디버그 모드에서 단계를 밟아서 인쇄 루프를 55 번 거치며, 코드를 인쇄 기능으로 반환하여 그 부분을 알려줍니다 인쇄 된 페이지는 인쇄 소스에없는 인쇄 방법으로 떨어지며, 내가 다시 되돌아 가면 다시 루프의 시작 부분에 있으며 lineCount는 14입니다. 부분적으로는 11 개의 파일을 인쇄 할 때입니다. 프로그램에 따르면 Vector의 해당 부분을 아직 보지 못했지만 말입니다.

누군가가 그 원인을 조금이라도 알고 있다면 정말 도움이됩니다. 목록 인쇄와 관련된 코드 덩어리가 있습니다. 바라기를 충분합니다.

 lineCount = 13; 
    int lineSpacing = 14; 
    g.setFont(new Font("Dialog", Font.PLAIN, 10)); 
    boolean color = true; 
    if (summ) { 
     g.drawString(((TreePath) printPaths.get(0)).getPathComponent(
       ((TreePath) printPaths.get(0)).getPathCount() - 3) 
       .toString() 
       + " : " 
       + ((TreePath) printPaths.get(0)).getPathComponent(
         ((TreePath) printPaths.get(0)).getPathCount() - 5) 
         .toString(), 36, lineCount * lineSpacing); 
     lineCount++; 
     //for (int j = 1; j < printPaths.size(); j++) { 
     while((printPaths.size()>1) && lineCount<55){ 
      String type = ((TreePath) printPaths.get(1)).getPathComponent(
        ((TreePath) printPaths.get(1)).getPathCount() - 5) 
        .toString(); 
      String date = ((TreePath) printPaths.get(1)).getPathComponent(
        ((TreePath) printPaths.get(1)).getPathCount() - 3) 
        .toString(); 
      String typeU = ((TreePath) printPaths.get(0)) 
        .getPathComponent(
          ((TreePath) printPaths.get(1)).getPathCount() - 5) 
        .toString(); 
      String dateU = ((TreePath) printPaths.get(0)) 
        .getPathComponent(
          ((TreePath) printPaths.get(1)).getPathCount() - 3) 
        .toString(); 
      if (!(type == typeU) && (date == dateU)) { 
       lineCount++; 
       g.setColor(c1); 
       g.drawString(date + " : " + type, 36, lineCount 
         * lineSpacing); 
       lineCount++; 
      } 
      if(color) 
       g.setColor(c1); 
      else 
       g.setColor(c2); 
      g.drawString(((TreePath) printPaths.get(1)) 
        .getLastPathComponent().toString(), 54, lineCount 
        * lineSpacing); 
      color=!color; 
      lineCount++; 
      printPaths.remove(0); 
      System.out.println(printPaths.size()); 
      System.out.println(lineCount); 
     } 
    } 

답변

0

결국 자바는 내가하려고했던 것들을 필요로하지 않고 자체적으로 페이지 네이션을 구현한다는 것을 발견했다.

1

정방향으로 반복하는 동안 printPaths 컬렉션에서 제거하는 것으로 보입니다. 그렇다면, 나는 이것이 엉망이 될 수 있다는 것에 놀라지 않습니다. 대신에 이터레이터를 사용해보십시오. 당신은 또한 큰 no-no 인 paint 또는 paintComponent 메쏘드의 내부에서 프로그램의이 논리 부분을 수행하는 것처럼 보입니다. 메서드가 실행될 때 또는 메서드가 실행되는 경우를 완전히 제어 할 수 없으므로이 메서드 외부에서 논리를 수행하십시오.

+0

기술적으로 그것을 반복하지는 않습니다. drawStrings는 매번 같은 위치에서 잡아지만 앞에있는 경로가 제거되므로 반복과 동일한 효과를 갖습니다. 이렇게하면 두 번째 페이지에서 동일한 벡터를 사용할 수 있습니다. Iterator를 사용하여 이와 같은 작업을 수행 할 수 있습니까? 그리고 그것이 사용 된 유일한 장소이기 때문에 모든 로직이 print() 메소드 내부에 있습니다. 나는 그것을 외부에 두려고했지만 print() 메서드에 인수를 전달할 방법이없는 것 같아 잘 작동하지 않았다. – SaintWacko

+0

'Iterator'의'remove()'메쏘드를'Vector'의 메쏘드보다는 사용하십시오. – trashgod

관련 문제