Java Swing JScrollPane line number glitch

2019-05-29 01:17发布

问题:

I have a simple JEditorPane inside a JScrollPane that displays line numbers on the left side. It works great except when you move the window off screen and pull it back again, it looks the this when you stop dragging:

any ideas? Should I need to be listening for a move/drag event and calling repaint/revalidate somewhere?

Thought it might be something obvious, but here is some code. I am using the JSyntaxPane.

    public EditorPanel()
        {
            this.setLayout(new BorderLayout());

            PythonSyntaxKit.initKit();
            codeEditor = new JEditorPane();
            JScrollPane scrPane = new JScrollPane(codeEditor);
            Dimension d = new Dimension(710,702);
            codeEditor.setPreferredSize(d);
            codeEditor.setContentType("text/python");
            codeEditor.setText("Welcome to PhysUtil!");
            this.add(scrPane, BorderLayout.CENTER);

            toolbar = new PhysUtilToolbar();
            this.add(toolbar, BorderLayout.PAGE_START);

            this.repaint();
            }
//from MainFrame Class...
public EditorPanel mainEditor;
    public MainFrame()
    {
        //Someone can figure out how to load the icon...kept throwing an error
        //ImageIcon icon = new ImageIcon(getClass().getResource("exit.png"));
        PhysUtilMenuBar menuBar = new PhysUtilMenuBar();
        this.mainEditor = new EditorPanel();
        menuBar.editorPanel = mainEditor;

        this.setJMenuBar(menuBar);
        this.setTitle("PhysUtil");
        this.setLocationRelativeTo(null);       
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(mainEditor);
        Image icon = Toolkit.getDefaultToolkit().getImage("icon.jpg");
        this.setIconImage(icon);
        this.setSize(800, 800);
        this.setLocation(0, 0);
        this.setVisible(true);
    }

回答1:

Add a WindowListener/WindowStateListener/WindowFocusListener... and see which events are getting fired if you drag your app. to secondary screen and/or back. From there if you know the events triggered try to listen on final event (whatever it will be) and invalidate your editor area (make it dirty) and repaint it. SSCCE would help too.