2015-02-25 7 views
0

У меня есть несколько элементов GUI, добавленных в JPanel. JPanel добавляется в JScrollPane. JScrollPane добавляется в JFrame (раздел CENTER BorderLayout).Утилизация элементов GUI

Иногда мне нужно удалить JScrollPane и сделать пространство доступным для других элементов. Я предоставил для этого метод. Хотите убедиться, что этот метод использует все ресурсы, используемые старым JScrollPane, и делает их доступными для Garbage Collection. См. Код ниже. Является ли мой метод clearCenter() достаточным для выполнения этой задачи? Есть ли лучший способ сделать это?

Спасибо.

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

public class MyGui extends JFrame { 
    private JScrollPane scroll; 
    private JPanel panel; 
    private JButton button1; 
    private JButton button2; 
    private JButton button3; 
    private JButton button4; 

    // Constructor 
    public MyGui() { 
     super("Playback"); 
     setSize(250, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BorderLayout layout = new BorderLayout(); 
     setLayout(layout); 

     panel = new JPanel(); 
     GridLayout grid = new GridLayout(0, 1, 30, 30); 
     panel.setLayout(grid); 

     button1 = new JButton("Button1"); 
     button2 = new JButton("Button2"); 
     button3 = new JButton("Button3"); 
     button4 = new JButton("Button4"); 
     panel.add(button1); 
     panel.add(button2); 
     panel.add(button3); 
     panel.add(button4); 

     scroll = new JScrollPane(panel, 
       JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     add(scroll, BorderLayout.CENTER); 
     add(new JLabel("South", JLabel.CENTER),BorderLayout.SOUTH); 
     add(new JLabel("North", JLabel.CENTER),BorderLayout.NORTH); 
     add(new JLabel("East", JLabel.CENTER),BorderLayout.EAST); 
     add(new JLabel("West", JLabel.CENTER),BorderLayout.WEST); 
     setVisible(true); 
    } 

    public void clearCenter() { 
     button1 = null; 
     button2 = null; 
     button3 = null; 
     button4 = null; 
     panel = null; 
     remove(scroll); 
     scroll = null; 
    } 

} 

ответ

2

Иногда мне нужно удалить JScrollPane и сделать пространство для других элементов.

Использовать CardLayout, как показано на странице this answer. И я не стал бы слишком беспокоиться об утилизации панели прокрутки, сохранить ее в памяти. Когда это необходимо, обновите содержимое панели прокрутки, а затем вернитесь к этой карте в макете.

Сброс содержимого панели прокрутки можно выполнить, как показано ниже. Активируйте первую кнопку, чтобы увидеть, как панель кнопок была заменена желтой панелью как вид панели прокрутки. Обратите внимание, что этот код является «готовым к запуску» MCVE (с main(String[]), чтобы показать его на экране). Пожалуйста, введите код MCVE в будущем.

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

public class MyGui extends JFrame { 

    private JScrollPane scroll; 
    private JPanel panel; 
    private JPanel brightPanel; 
    private JButton button1; 
    private JButton button2; 
    private JButton button3; 
    private JButton button4; 

    // Constructor 
    public MyGui() { 
     super("Playback"); 
     setSize(250, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BorderLayout layout = new BorderLayout(); 
     setLayout(layout); 

     // create the panel, but don't add it yet. 
     brightPanel = new JPanel(); 
     brightPanel.setBackground(Color.YELLOW); 

     panel = new JPanel(); 
     GridLayout grid = new GridLayout(0, 1, 30, 30); 
     panel.setLayout(grid); 

     button1 = new JButton("Button1"); 
     button2 = new JButton("Button2"); 
     button3 = new JButton("Button3"); 
     button4 = new JButton("Button4"); 
     panel.add(button1); 
     panel.add(button2); 
     panel.add(button3); 
     panel.add(button4); 

     ActionListener listener = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       changeViews(); 
      } 
     }; 
     button1.addActionListener(listener); 

     scroll = new JScrollPane(panel, 
       JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     add(scroll, BorderLayout.CENTER); 
     add(new JLabel("South", JLabel.CENTER), BorderLayout.SOUTH); 
     add(new JLabel("North", JLabel.CENTER), BorderLayout.NORTH); 
     add(new JLabel("East", JLabel.CENTER), BorderLayout.EAST); 
     add(new JLabel("West", JLabel.CENTER), BorderLayout.WEST); 
     setVisible(true); 
    } 

    public void changeViews() { 
     scroll.setViewportView(brightPanel); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       new MyGui(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Thanks. Если не слишком много проблем, можете ли вы наметить шаги, необходимые для очистки и перезагрузки JScrollPlane новым контентом? –

+0

См. Редактирование ... –

+0

Будет стремиться предоставить MCVE в будущем. Не хотел загромождать мой вопрос дополнительными классами или файлами, чтобы уйти. Я изучаю вашу технику нереста нового потока прямо изнутри 'main()'. Я видел, что вы использовали ту же технику в примере кода «CardLayout», на который вы ссылались. Мой единственный вопрос - что означает «новый Runnable()»? Поскольку «Runnable» является интерфейсом, а не классом (и я не вижу ключевое слово «реализует»), как создается фактический объект, созданный из этого утверждения? Спасибо за вашу снисходительность. –

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