2013-07-17 3 views
0

Я в основном пытался создать меню для игры, используя JFrame и отключая 2 JPanels (один для меню и один для реальной игры). Я пытаюсь реализовать самый простой формат, о котором я могу думать, но не могу заставить его работать. Если кто-нибудь может объяснить, что не так с кодом, я был бы признателен.Использование нескольких JPanels в одном JFrame

Вот мой JFrame, панель меню и ActionListener

package buttonMenu; 

import java.awt.BorderLayout; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Skeleton extends JFrame implements ActionListener{ 

JPanel menu; 
JButton button; 

public Skeleton(){ 

setDefaultCloseOperation(EXIT_ON_CLOSE); 
setSize(400, 400); 
setVisible(true); 

menu = new JPanel(); 
button = new JButton("button"); 

menu.setSize(400, 400); 
menu.setBackground(Color.BLACK); 
menu.setVisible(true); 
menu.add(button); 

button.setLocation(200, 200); 
button.addActionListener(this); 

add(menu, BorderLayout.CENTER); 

} 

public void actionPerformed(ActionEvent a){ 
    JPanel panel = Game.Game(); 
    this.remove(menu); 
    this.add(panel); 
} 

public static void main(String args[]){ 
    new Skeleton(); 
} 
} 

actionPerformed вызывает панель, созданную в этом классе

package buttonMenu; 
import java.awt.Color; 
import javax.swing.JPanel; 
public class Game{ 

public static JPanel Game(){ 
    JPanel panel = new JPanel(); 
    panel.setSize(400, 400); 
    panel.setBackground(Color.WHITE); 
    return panel;  
} 

} 

Опять же, если кто-нибудь может объяснить мне, что случилось с этим кодом I был бы признателен. Благодаря

ответ

2

При добавлении/удалении компонентов, вам необходимо revalidate родительский контейнер, чтобы заставить его передать себя вне ...

public void actionPerformed(ActionEvent a){ 
    JPanel panel = Game.Game(); 
    this.remove(menu); 
    this.add(panel); 
    this.revalidate(); 
} 

Лучшим решением было бы использовать что-то вроде CardLayout

Посмотрите на How to use CardLayout для получения более подробной информации

ps- Я должен добавить. Вам следует избегать расширения непосредственно от JFrame, вместо этого создайте приложение целиком на базовом компоненте, например JPanel. Когда вам нужно отобразить его, создайте экземпляр JFrame и добавьте к нему компонент приложения. Таким образом ваше приложение становится более гибким с точки зрения развертывания и повторного использования.

+0

Спасибо за совет, я никогда не использовал revalidate, но он работает сейчас. Кроме того, спасибо за ссылку, похоже, что макет карты - это путь. –

1

Используйте метод validate() для просмотра изменений.

public void actionPerformed(ActionEvent a){ 
    JPanel panel = Game.Game(); 
    this.remove(menu); 
    this.add(panel); 
    this.validate(); 
} 
1

Что случилось с моим кодом может быть своего рода смутное вопрос, но я разберусь некоторые моменты:

  • extends JFrame: Вы на самом деле не простирающейсяJFrame, вы» просто используя один, как часть вашего графического интерфейса.
  • В качестве ответа на другие вопросы следует добавить revalidate() после добавления/удаления компонентов.
  • menu.setVisible(true), обычно это не требуется.
  • Возможно, не неправильный, но я обычно строю весь свой интерфейс сначала (т.е., создавая и добавляя исходные компоненты), и только затем устанавливаем размеры и видимость фрейма.
  • Вы используете весь этот код в потоке main; Компоненты Swing не являются потокобезопасными. См. Concurrency in Swing для получения дополнительной информации.
  • Я знаю, что это для игры, но абсолютное позиционирование в ваших панелях действительно необходимо? Используйте Менеджеры макетов, если это возможно (с исключением для вашей игровой панели, которая, вероятно, сделает только обычную роспись).
+0

Ах, извините, я просто понял, что забыл указать, что делал мой код. Спасибо за совет, хотя он работает сейчас. –