Как я изменяю JPanel в JFrame на лету?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

40
задан Andrew Thompson 26 February 2014 в 06:17
поделиться

8 ответов

Ваш вариант использования, кажется идеально подходящим для CardLayout.

В расположении карты можно добавить несколько панелей в том же месте, но тогда показать или скрыться, одна панель за один раз.

51
ответ дан Swapnonil Mukherjee 27 November 2019 в 01:12
поделиться

Я предлагаю, чтобы Вы добавили обе панели при создании кадра, затем изменили видимую панель путем вызова setVisible (истинный/ложный) на обоих. При вызове setVisible, родителя уведомят и попросят перекрашивать себя.

0
ответ дан Riduidel 27 November 2019 в 01:12
поделиться

Все это зависит от как его попытка использоваться. Если Вы захотите переключиться назад и вперед между этими двумя панелями, тогда используют CardLayout. Если бы Вы только переключаетесь сначала на второе однажды и (и не возвращаетесь), тогда, я использовал бы telcontar предложение с и просто заменил бы его. Хотя, если бы JPanel не является единственной вещью в Вашем кадре, я использовал бы , удаляют (java.awt. Компонент) вместо removeAll.

, Если Вы являетесь где-нибудь промежуточными эти два случая в основном компромисс пространства времени. CardLayout сэкономит Вам время, но поднимет больше памяти при необходимости сохранить эту целую другую панель в памяти в любом случае. Но если Вы просто заменяете панель при необходимости и создаете ее по требованию, Вы не должны сохранять это meory вокруг, но требуется больше времени для переключения.

Также можно попробовать JTabbedPane для использования вкладок вместо этого (его еще более легкое, чем CardLayout, потому что он обрабатывает показ/сокрытие automitically)

3
ответ дан Community 27 November 2019 в 01:12
поделиться

На пользовательском действии:

//необходимо сделать что-то вроде

myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()

myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()

Тогда, можно изменить размеры wndow по мере необходимости.

5
ответ дан ShawnD 27 November 2019 в 01:12
поделиться
frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.

Помнят, ссылка копии 'использования Java значением' передача параметров. Так изменяя переменное изменение привычки копии ссылки передали другим методам.

Также примечание JFrame очень сбивает с толку от имени удобства использования. Добавление компонента или установка расположения (обычно) выполняют операцию на довольном область. Достаточно странно получение расположения действительно дает Вам менеджера по расположению кадра.

19
ответ дан Tom Hawtin - tackline 27 November 2019 в 01:12
поделиться

1) Устанавливая первую Панель:

JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());

2) Замена панели:

frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());

Также уведомление, что необходимо сделать это в Потоке События, для обеспечения этого использования SwingUtilities.invokeLater или SwingWorker

25
ответ дан jjnguy 27 November 2019 в 01:12
поделиться

Другие люди ответили на вопрос. Я хочу предложить, чтобы Вы использовали JTabbedPane вместо того, чтобы заменить содержание. Как правило это плохо для имения визуальных элементов приложения, исчезают или быть замененным другим содержанием. Конечно, существуют исключения к каждому правилу, и только Вы и Ваше пользовательское сообщество можете решить лучший подход.

1
ответ дан James A Wilson 27 November 2019 в 01:12
поделиться

Надеюсь, этот фрагмент кода даст вам представление об изменении jPanels внутри JFrame.

public class PanelTest extends JFrame {

        Container contentPane;

        public PanelTest()  {
           super("Changing JPanel inside a JFrame");
           contentPane=getContentPane();
        }

        public void createChangePanel() {
           contentPane.removeAll();
           JPanel newPanel=new JPanel();
           contentPane.add(newPanel);
           System.out.println("new panel created");//for debugging purposes
           validate();
           setVisible(true);
        }
}
6
ответ дан 27 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: