JViewport.setView出现无法捕获的错误



我无法提供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。

然而,错误也没有被捕获。。。。

此处写Paneln(为完整起见)

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

使用此处引用的方法之一查找EDT违规行为。

我应该把CheckThreadViolationRepaintManager放进工厂吗?

如图所示,您可以将RepaintManager替换为CheckThreadViolationRepaintManager的实例来捕获冲突。

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());

如果调用线程既不返回也不抛出异常,那么它显然被卡住了。你可以尝试两件事:

  1. 附加一个调试器,看看从setView调用开始发生了什么(如@DeltaLima所建议的)
  2. 运行该程序并创建一个线程转储(说明因操作系统而异,不幸的是您没有提到您的)。线程转储将向您显示您的程序被卡住的确切位置以及它被卡住的原因,即其他线程可能持有您想要的锁

我建议从2.开始,因为它既便宜又快捷。

祝你好运。

相关内容

  • 没有找到相关文章

最新更新