Мерцание при перекрашивании JPanel внутри JScrollPane - PullRequest
3 голосов
/ 01 января 2011

У меня проблема с перерисовкой JPanel внутри JScrollPane.

По сути, я просто пытаюсь «обернуть» мою существующую панель редактирования (она изначально расширяла JPanel) в JScrollPane.

Кажется, что JPanel обновляется слишком часто (массовое мерцание). Как я мог бы предотвратить это? Я пытался использовать setIgnoreRepaint (), но, похоже, он ничего не делал.

Будет ли работать эта текущая реализация или мне нужно будет создать еще один внутренний класс для точной настройки JPanel, который я использую для отображения графики?

Код скелета:

public class MyProgram extends JFrame{

    public MyProgram(){
        super();
        add(new EditPanel());
        pack();
    }
    private class EditPanel extends JScrollPane{

        private JPanel graphicsPanel;

        public EditPanel(){
            ///EDIT, sorry, should have mentioned this was here before
            super();
            graphicsPanel = new JPanel();
            this.setViewportView(graphicsPanel);
            //END EDIT
        }

        public void paintComponent(Graphics g){
            graphicsPanel.revalidate(); //update the scrollpane to current panel size
            repaint();

            Graphics g2 = graphicsPanel.getGraphics();
            g2.drawImage(imageToDraw, 0, 0, null);
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 01 января 2011

НИКОГДА не вызывайте revalidate () или repaint () внутри метода рисования.Вы вызываете бесконечный цикл перерисовки.

Нет необходимости расширять JScrollPane вообще.Вы никогда не должны расширять класс, просто чтобы добавить к нему компонент.Именно для этого предназначен метод setViewportView (...).

Если у вас есть пользовательское рисование, вы расширяете JPanel и переопределяете метод paintComponent () панели.для перерисовки панели, которую вы просто вызываете, panel.repaint ().

1 голос
/ 01 января 2011

Хм. Почему бы вы подкласс JScrollPane? Если бы я делал это, я бы подкласс JPanel или JTable, и обернуть мой класс в JScrollPane:

JTable table = new MySpecialJTable();
JScrollPane scrollPane = new JScrollPane(table);
Component container = /* scrollPane goes in here, set the size of scrollPane
       yourself or let a layout manager do that for you */
container.add(scrollPane);
0 голосов
/ 01 января 2011

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

Scrollpane.getViewPort().add(JComponent);

Если нет, посмотрите JScrollPane и , как использовать JScrollPane's. Я никогда раньше не видел, чтобы кто-нибудь делал подкласс JScrollPane.

Я могу ошибаться, конечно. Я скоро узнаю.

Лично я нахожу, что Swing всегда немного отстает от перекраски, когда все становится сложным, но никогда не "массово мерцает".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...