Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Ваш вариант использования, кажется идеально подходящим для CardLayout.
В расположении карты можно добавить несколько панелей в том же месте, но тогда показать или скрыться, одна панель за один раз.
Я предлагаю, чтобы Вы добавили обе панели при создании кадра, затем изменили видимую панель путем вызова setVisible (истинный/ложный) на обоих. При вызове setVisible, родителя уведомят и попросят перекрашивать себя.
Все это зависит от как его попытка использоваться. Если Вы захотите переключиться назад и вперед между этими двумя панелями, тогда используют CardLayout. Если бы Вы только переключаетесь сначала на второе однажды и (и не возвращаетесь), тогда, я использовал бы telcontar предложение с и просто заменил бы его. Хотя, если бы JPanel не является единственной вещью в Вашем кадре, я использовал бы , удаляют (java.awt. Компонент) вместо removeAll.
, Если Вы являетесь где-нибудь промежуточными эти два случая в основном компромисс пространства времени. CardLayout сэкономит Вам время, но поднимет больше памяти при необходимости сохранить эту целую другую панель в памяти в любом случае. Но если Вы просто заменяете панель при необходимости и создаете ее по требованию, Вы не должны сохранять это meory вокруг, но требуется больше времени для переключения.
Также можно попробовать JTabbedPane для использования вкладок вместо этого (его еще более легкое, чем CardLayout, потому что он обрабатывает показ/сокрытие automitically)
На пользовательском действии:
//необходимо сделать что-то вроде
myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()
myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()
Тогда, можно изменить размеры wndow по мере необходимости.
frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.
Помнят, ссылка копии 'использования Java значением' передача параметров. Так изменяя переменное изменение привычки копии ссылки передали другим методам.
Также примечание JFrame
очень сбивает с толку от имени удобства использования. Добавление компонента или установка расположения (обычно) выполняют операцию на довольном область. Достаточно странно получение расположения действительно дает Вам менеджера по расположению кадра.
1) Устанавливая первую Панель:
JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());
2) Замена панели:
frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());
Также уведомление, что необходимо сделать это в Потоке События, для обеспечения этого использования SwingUtilities.invokeLater или SwingWorker
Другие люди ответили на вопрос. Я хочу предложить, чтобы Вы использовали JTabbedPane вместо того, чтобы заменить содержание. Как правило это плохо для имения визуальных элементов приложения, исчезают или быть замененным другим содержанием. Конечно, существуют исключения к каждому правилу, и только Вы и Ваше пользовательское сообщество можете решить лучший подход.
Надеюсь, этот фрагмент кода даст вам представление об изменении 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);
}
}