2011-12-15 4 views
0

Мне нужно очистить JPanel. Этот JPanel под названием mainPane имеет GridLayout, который содержит JScrollPane's, and these JScrollPane s contain custom JPanel s that override paintComponent() `.Объект перерисовывается даже после удаления

Независимо от того, что я пытаюсь устанавливающим список в нуль, заменив старый экземпляр с новым объектом, как только я изменить размер рамки окна, вид в paintComponent() прибудет никогда звонил и снова рисует точку внутри mainPane.

public void createContentPane() 
    { 
     gridLay = new GridLayout(GRID_ROWS, GRID_COLUMNS); 

     graphicViewList = new ArrayList<View>(); 
     for (int i = 0; i < graphicViewList.size(); i++) { 
      View v = graphicViewList.get(i); 
      v = null; 
     } 
     mainPane = new JPanel(); 

     clearGrid(); 
     mainPane.removeAll(); 
     mainPane.validate(); 
     graphicViewList.clear(); 
     imageModel.deleteObservers(); 
     mainPane.setLayout(gridLay); 
     this.getContentPane().remove(mainPane); 
     this.getContentPane().add(mainPane, BorderLayout.CENTER); 
     mainPane.revalidate(); 
     mainPane.repaint(); 

    } 

    public void createViews() 
    { 
     int idx = 0; 
     graphicViewList.clear(); 

     while(idx < NUM_PERSPECTIVE) //iterator? 
     { 
      if(idx == 0) 
      { 
       graphicViewList.add(new ThumbnailView(this, imageModel)); 
       mainPane.add(new JScrollPane(graphicViewList.get(idx))); 
       idx++; 
       continue; 
      } 
      graphicViewList.add(new ImageView(this, imageModel)); 
      mainPane.add(new JScrollPane(graphicViewList.get(idx))); 
      idx++; 
     } 

     for (int i = 0; i < graphicViewList.size(); i++) 
      graphicViewList.get(i).removeFocus(); 

     this.getContentPane().add(mainPane, BorderLayout.CENTER); 
    } 

    private void clearGrid() 
    { 
     for (int i = 0; i < mainPane.getComponentCount(); i++) { 
      JScrollPane sP =(JScrollPane) mainPane.getComponent(i); 
      sP = null; 

     } 
    } 

createContentPane() является излишеством, я знаю, я просто в отчаянии. Таким образом, первая функция и вторая функция вызываются в конструкторе GUI. Когда я звоню в createContentPane(), чтобы заменить старый пользовательский интерфейс (с той же структурой, только другим контентом), как только я изменю размер контейнера, его содержимое нарисовано заново. Единственное различие заключается в том, что на втором createContentPane() вызывается рисование с размерами по макету, и элементы больше не находятся внутри.

Я бы подумал, что createContentPane() опустошит все и удалит все ссылки, которые у меня могут быть, но paintComponent() все еще управляет рисованием полос прокрутки с видами.

+0

Для более эффективной помощи следует отправить сообщение [SSCCE] (http://sscce.org/). –

ответ

2

В clearGrid(), вам нужно позвонить remove(Component comp) (в вашем случае, зр) или removeAll();

2

В вашем методе clearGrid, вы ничего от панели не вынимая; вы просто получаете ссылку на то, что находится внутри mainPane, а затем устанавливаете ссылку на null. Вместо этого вам нужно на самом деле позвонить mainPane.remove(sP); для каждой панели прокрутки.

Кроме того, вместо этого цикла вы можете попробовать позвонить mainPane.removeAll();. Обратите внимание, что, как упоминалось в документации, вы должны повторно проверить панель.

Container.removeAll


Вот что SSCCE, что Эндрю Томпсон уже упоминалось ранее. Попробуйте сделать это в будущем, задавая вопросы, чтобы люди могли просто запустить его и помочь исправить это.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class PanelClearerExample { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       PanelClearerExample app = new PanelClearerExample(); 
       app.startUp(); 
      } 
     }); 
    } 

    private final String CLEAR_COMMAND = "Clear"; 
    private final String REBUILD_COMMAND = "Rebuild"; 
    private JFrame controlFrame; 
    private int displayCount = 0; 
    private JFrame displayFrame; 
    private JPanel displayPanel = new JPanel(); 

    private void startUp() { 
     displayFrame = new JFrame("Display"); 
     displayFrame.setSize(300, 300); 
     displayFrame.setLocation(300, 0); 
     displayFrame.add(buildDisplay(), BorderLayout.CENTER); 

     controlFrame = new JFrame("Control"); 
     controlFrame.setSize(200, 100); 
     controlFrame.add(buildControl(), BorderLayout.CENTER); 
     controlFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     displayFrame.setVisible(true); 
     controlFrame.setVisible(true); 
    } 

    private Component buildDisplay() { 
     populateDisplay(); 
     return displayPanel; 
    } 

    private void populateDisplay() { 
     displayCount++; 
     displayPanel.setLayout(new GridLayout(2, 2)); 
     String text = "Display " + displayCount; 
     for (int i = 0; i < 4; i++) { 
      displayPanel.add(new JLabel(text, JLabel.CENTER)); 
     } 
    } 

    private Component buildControl() { 
     JPanel p = new JPanel(new BorderLayout()); 
     final JButton button = new JButton(CLEAR_COMMAND); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (CLEAR_COMMAND.equals(ae.getActionCommand())) { 
        clearDisplay(); 
        button.setText(REBUILD_COMMAND); 
        button.setActionCommand(REBUILD_COMMAND); 

       } else { 
        repopulateDisplay(); 
        button.setText(CLEAR_COMMAND); 
        button.setActionCommand(CLEAR_COMMAND); 
       } 
      } 
     }); 
     p.add(button); 

     return p; 
    } 

    private void clearDisplay() { 
     displayPanel.removeAll(); 
     displayPanel.repaint(); 
    } 

    private void repopulateDisplay() { 
     populateDisplay(); 
     displayPanel.revalidate(); 
    } 
} 
+0

Я вызываю mainPane.removeAll() немного ниже? Я попытаюсь вызвать remove (sP) для каждого, хотя. –

+0

Что значит «немного ниже»? Я говорю, что вы можете заменить цикл внутри этого метода clearGrid вызовом mainPane.removeAll(); –

+0

Я имею в виду, что вызов уже сделал несколько строк ниже в этом методе. Цикл был добавлен в последнюю минуту, чтобы проверить, будет ли что-нибудь вообще работать, изначально removeAll был единственным методом, вызываемым в этом методе. –

Смежные вопросы