2010-12-31 18 views
3

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

В принципе, я просто пытаюсь «обернуть» существующую EditPanel (она первоначально расширила 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

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

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

Если у вас есть обычная роспись, вы расширяете JPanel и переопределяете метод paintComponent() панели.

Затем, если вы хотите перекрасить панель, которую вы просто вызываете, panel.repaint().

+0

Спасибо за объяснение, почему он не работает. Первоначально я использовал EditPanel, расширяя JFrame, но поскольку я создавал несколько экземпляров, и каждый из них был в JScrollPane, я решил, что было бы более компактно интегрировать JScrollPane в объект. Я вернусь к расширению JFrame. – pR0Ps

0

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

Scrollpane.getViewPort().add(JComponent); 

Если нет, посмотрите на JScrollPane и how to use JScrollPane годов. Раньше я никогда не видел подкласса JScrollPane.

Возможно, я ошибаюсь. Я скоро узнаю.

Я лично считаю, что Swing всегда слегка медлится, когда вещи становятся сложными, но никогда не «мерцает».

1

Хм. Зачем вам подкласс 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); 
Смежные вопросы