Объект перерисовывается даже после удаления - PullRequest
0 голосов
/ 15 декабря 2011

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

Независимо от того, что я пытаюсь - установив в списке значение null, заменив старый экземпляр новым объектом, - как только я изменю размер рамки окна, вызывается представление paintComponent() get, и оно рисует представления внутри 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() все-таки удастся нарисовать полосы прокрутки с представлениями.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

В вашем методе clearGrid вы ничего не удаляете с панели; вы просто получаете ссылку на то, что внутри mainPane, а затем устанавливаете эту ссылку на ноль. Вместо этого вам нужно вызвать 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();
    }
}
2 голосов
/ 15 декабря 2011

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

...