抓不到误差JViewport.setView(uncatchable error with JVie

2019-10-19 02:12发布

我不能提供一个SSCCE,因为我不能让错误重复我的大应用程序之外。

但这里是一个片段,并输出:

            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.shared.swing.styles.support.border.DefaultBorderSetter$PaddingBorder@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.shared.swing.styles.support.border.DefaultBorderSetter$PaddingBorder@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);
    }   
    }
}

编辑1

我已经改变了对我的java.util.Timer中使用的invokeLater:

        class RemindTask extends TimerTask {

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

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

Answer 1:

使用引用的方法之一在这里找到EDT违规行为。

我应该把CheckThreadViolationRepaintManager在厂?

如图所示在这里 ,你可以替换RepaintManager与实例CheckThreadViolationRepaintManager赶上违法行为。

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());


Answer 2:

如果调用线程没有返回,也不抛出一个异常,这显然是某个地方卡住了。 您可以尝试两件事情:

  1. 附加一个调试器,看看发生了什么事,从开始setView调用(由@DeltaLima的建议)
  2. 运行的东西,并创建一个线程转储(说明因OS,可惜你没有提到你的)。 线程转储会告诉你到底你的程序被卡住,为什么它被卡住,即什么其他线程可能认为你想要一个锁。

我建议先从2,因为它是便宜和快捷。

祝好运。



文章来源: uncatchable error with JViewport.setView