2013-12-05 6 views
1

Я НЕ МОЖЕТ предоставить SSCCE, поскольку я не могу сделать ошибку повторяемой за пределами моего большого приложения.ошибка нечеткой ошибки с JViewport.setView

Но вот фрагмент и выход:

  if (vp != null) { 
       try { 
        starterModule.writePaneln("Sigma.show() 4.1 vp: "+vp); 
        starterModule.writePaneln("Sigma.show() 4.1 P: "+P); 
        starterModule.writePaneln("Sigma.show() 4.1 scrollPane: "+scrollPane); 

        vp.setView(P); 
        starterModule.writePaneln("Sigma.show() 4.2"); 

       } catch (Exception e) { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("C:\\javaout2.txt", true))); 
        out.println("ERROR SIGMA e:"); 
        out.flush(); 
        out.close(); 
       } 
      } 

Выход:

Sigma.show() 4.1 vp: javax.swing.JViewport[,0,0,902x800,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=,scrollUnderway=false] 
    Sigma.show() 4.1 P: javax.swing.JPanel[,0,0,0x0,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=com.devexperts.dxpro.share[email protected]4719dad8,flags=9,maximumSize=,minimumSize=,preferredSize=] 
    Sigma.show() 4.1 scrollPane: javax.swing.JScrollPane[,0,30,917x800,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.devexperts.dxpro.share[email protected]14716d46,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=com.devexperts.dxpro.shared.swing.styles.laf.impl.basic.StyledScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,902,0,15x800,layout=com.devexperts.dxpro.shared.swing.styles.laf.impl.basic.StyledScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,0,0,902x800,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=,scrollUnderway=false],viewportBorder=] 

Затем программа появляется замерзать на vp.setView (P); поскольку следующий writePaneln не вызывается.

ОДНАКО, ошибка не в ловушке либо ....

Здесь writePaneln (для полноты)

public static void writePaneln(String txt){ 
    if(DEBUG){ 
    try { 
     synchronized (textPane) { 
      //textPane.getDocument().insertString(textPane.getDocument().getLength(), txt + "\n", null); 

      PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("C:\\javaout.txt", true))); 
      out.println(txt); 
      out.flush(); 
      out.close(); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     JOptionPane.showMessageDialog(null,"writePaneln ERROR: "+e); 
    } 
    } 
} 

EDIT 1

Я изменил к использованию invokeLater в моем java.util .timer:

 class RemindTask extends TimerTask { 

       @Override 
       public void run() { 
        SwingUtilities.invokeLater(
          new Runnable(){ 

           @Override 
           public void run() { 
            handleGO(); 
           }; 
          } 
        ); 
       } 
     } 
+0

звучит как нарушение EDT - все доступ к компонентам качания _must_ происходит на EDT. В этом случае нет необходимости синхронизировать на текстовой панели (вы находитесь в одном потоке, то есть EDT), или вы нарушаете правило – kleopatra

+0

@kleopatra Я попытался удалить синхронизированную (текстовую панель), и я получаю ТАКУЮ ошибка – ManInMoon

+1

удалить это не так (извините за то, что было неясно) - вы должны убедиться, что каждый и каждый доступ к компоненту swing находится на EDT (чтобы узнать больше, взгляните на главу параллелизма в учебнике, упомянутом в вики Swing tag, щелкните вкладку с информацией) – kleopatra

ответ

1

Используйте один из подходов привел here, чтобы найти нарушения EDT.

Должен ли я поставить CheckThreadViolationRepaintManager на завод?

Как показано here, вы можете заменить RepaintManager с экземпляром CheckThreadViolationRepaintManager поймать нарушений.

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager()); 
+0

У меня нет основного (или, скорее, не редактируемого мной). Вот почему я спросил, где положить это ДРУГ, чем в основном. – ManInMoon

+0

Возможно, перед 'setVisible()'? – trashgod

1

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

  1. Attach отладчик и посмотреть, что случилось, начиная с setView вызова (как это было предложено @DeltaLima)
  2. Run вещь и создать поток дамп (инструкции различаются в зависимости от операционной системы, к сожалению, вы не упомянули об этом). Дамп потока покажет вам, где именно ваша программа застряла и почему она застряла, т. Е. Какой другой поток может содержать блокировку, которая вам нужна.

Я бы предпочел начать с 2., так как это дешево и быстро.

Удачи.

+0

Хорошая идея; подробнее [здесь] (http://helpx.adobe.com/experience-manager/kb/TakeThreadDump.html). – trashgod

Смежные вопросы