uncatchable error with JViewport.setView

前提是你 提交于 2019-12-11 07:58:51

问题


I CANNOT provide an SSCCE as I can't make error repeatable outside of my large App.

But here is a snippet and the output:

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

Output is:

    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=]

Then the program appears to freeze on vp.setView(P); as the next writePaneln is not called.

HOWEVER, the error is not trapped either....

Here writePaneln ( for completeness)

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

I have changed to using invokeLater in my java.util.timer:

        class RemindTask extends TimerTask {

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

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

回答1:


Use one of the approaches cited here to find EDT violations.

Should I put CheckThreadViolationRepaintManager in Factory?

As shown here, you can replace the RepaintManager with an instance of CheckThreadViolationRepaintManager to catch violations.

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());



回答2:


If the calling thread neither returns nor throws an exception, it is obviously stuck somewhere. You can try two things:

  1. Attach a debugger and see what happened starting from the setView call (as suggested by @DeltaLima)
  2. Run the thing and create a thread dump (instructions differ based on OS, unfortunately you didn't mention yours). The thread dump will show you exactly where your program is stuck and why it is stuck, i.e. what other thread may hold a lock that yours wants.

I'd recommend to start with 2., as it is cheap and quick.

Good luck.



来源:https://stackoverflow.com/questions/20395528/uncatchable-error-with-jviewport-setview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!