2015-05-01 3 views
0

Надеюсь, вы все можете мне помочь понять эту тайну. Я создал JPanel, который содержал кнопку «Назад» и имел приятный макет, который мне нравился. Я хотел добавить этот JPanel (я буду называть его homeButtonPanel отсюда) к нескольким другим JPANEL, потому что я хочу, чтобы все они имели кнопку «Назад».JPanel исчезает при добавлении к нескольким другим JPanel

Я добавил homeButtonPanel в JPanel gameRoom, а затем в JPanel gamePlay. Когда gameRoom был показан в основном JFrame, homeButtonPanel не отображался. Когда gamePlay был показан в главном JFrame, на нем отобразился homeButtonPanel :. Я не мог понять это так долго.

После так много путаницы и разочарования, я понял, что, когда я закомментировать строки, который добавил homeButtonPanel к панели Геймплей, homeButtonPanel будет отображаться на панели Люстра.

Почему я не могу добавить этот JPanel в несколько дополнительных JPanel?

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

 //Set up of the GameRoom Panel 
     //********************************************************************** 
     JPanel gameRoom = new JPanel(); 

     //create welcome label 
     JLabel welcomeGameRoom = new JLabel("Welcome to the GameRoom"); 

     //create the go home button (and its panel) 
     JPanel homeButtonHolder= new JPanel(); 
     JButton goHome = new JButton("Go Home"); 
     goHome.setVisible(true); 
     homeButtonHolder.add(goHome); 

     //add the go home holder to the gameplay panel 
     gameRoom.add(homeButtonHolder); 

     //add the welcome label to the gameplay panel 
     gameRoom.add(welcomeGameRoom); 

     //add the gameroom panel to the card panel 


     //Set up of the GamePlay Panel 
     //********************************************************************** 
     JPanel gamePlay = new JPanel(); 
     JLabel welcomeGamePlay = new JLabel("Welcome to the Game"); 

     //add the go home holder to the gameplay panel 
     //*****This is the line that is the issue *************** 
     gamePlay.add(homeButtonHolder); 

     //add the welcome label to the gameplay panel 
     gamePlay.add(welcomeGamePlay); 
+0

После [link] (http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html): «Каждый компонент GUI может содержаться только один раз. Если компонент уже находится в контейнере и вы пытаетесь добавить его в другой контейнер, компонент будет удален из первого контейнера, а затем добавлен ко второму « –

ответ

1

Я добавил homeButtonPanel к JPanel зал для игр, а затем к JPanel геймплеем.

Компонент может иметь только один родительский элемент, поэтому вы не можете добавить один и тот же компонент к нескольким панелям.

Итак, вам нужно создать два экземпляра «homeButtonPanel», а затем добавить экземпляр на каждую панель.

Другой вариант заключается в том, чтобы ваша основная панель использовала BorderLayout. Затем вы добавляете панель с помощью CardLayout в CENTER of BorderLayout. Затем «homeButtonPane» можно добавить в PAGE_END этой панели, так что теперь появится, что homeButtonPanel принадлежит к обеим панелям в CardLayout, даже когда вы меняете панели.

+0

Спасибо! @camickr Я не понимал, что у компонента может быть только один родитель. –