Странное поведение из вызова drawString Java Graphics в цикле - PullRequest
0 голосов
/ 19 ноября 2011

Я в полной растерянности.У меня есть метод, который проходит через Vector of TreePaths, содержащий пользовательский класс FileNode, и извлекает файл, содержащийся в каждом последнем узле.Результатом является распечатанный список всех имен файлов в векторе.У меня был цикл for, чтобы увеличивать его, и он работал нормально, но я изменил его на цикл while, чтобы позволить мне иметь несколько страниц.Теперь по какой-то причине он печатает только последние 11 файлов.

Я выяснил, что вызывает это, но я не знаю, почему или как это исправить.Я добавил строки для печати на консоли 'lineCount' и 'printPaths.size ()' и обнаружил, что lineCount увеличивается до 55, затем возвращается к 15 и продолжает увеличиваться.Имена фактически не начинали печататься, пока они не вернулись к 15.

Я прошел через это в режиме отладки, и он проходит цикл печати 55 раз, возвращает код функции печати, которая сообщает, что эточасть печатной страницы, затем она попадает в метод печати, для которого у меня нет источника, и когда я отступаю от этого, она возвращается в начало цикла, и lineCount равен 14.действительно странная часть заключается в том, что он печатает 11 файлов, хотя в соответствии с программой он еще даже не просматривал эту часть вектора.

Если у кого-то есть хоть малейшее представление о том, что вызвало это, я был бы очень признателен за помощь.Вот кусок кода, который занимается печатью списка.Надеюсь, этого достаточно.

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

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вы, кажется, удаляете из коллекции printPaths, перебирая ее в прямом направлении. Если так, я не удивлен, что это может быть испорчено. Попробуйте вместо этого использовать итератор. Вы также, кажется, выполняете эту логическую часть своей программы внутри метода paint или paintComponent, который является большим нет-нет. Делайте свою логику вне этого метода, так как у вас нет полного контроля над тем, когда или даже если метод сработает.

0 голосов
/ 23 ноября 2011

В конце концов я обнаружил, что в Java достаточно хорошо реализована нумерация страниц, без необходимости в том, что я пытался сделать.

...