2012-05-20 3 views
0

Я пытаюсь удалить JPanel, но не скрываю его, но я не могу найти что-либо, что работает.Удаление JPanel из JFrame

Это код на панели, которую необходимо удалить себя, когда кнопка нажата:

play.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Frame frame = new Frame(); //referencing to my JFrame class (this class is a JPanel) 
      //need to remove this panel on this line 
      frame.ThreeD(); // adds a new panel 
     } 
    }); 

ОБНОВЛЕНО

Это полный код:

package ThreeD; 

import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

import Run.Frame; 

public class Launcher extends JPanel{ 
    private JButton play, options, help, mainMenu; 
    private Rectangle rplay, roptions, rhelp, rmainMenu; 

    private int buttonWidthLocation, buttonWidth, buttonHeight; 
    private int width = 1280; 

    public Launcher() { 
     this.setLayout(null); 

     drawButtons(); 
    } 

    private void drawButtons() { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

     play = new JButton("Play"); 
     options = new JButton("Options"); 
     help = new JButton("Help"); 
     mainMenu = new JButton("Main Menu"); 

     buttonWidthLocation = (width/2) - (buttonWidth/2); 
     buttonWidth = 80; 
     buttonHeight = 40; 

     rplay = new Rectangle(buttonWidthLocation, 150, buttonWidth, buttonHeight); 
     roptions = new Rectangle(buttonWidthLocation, 300, buttonWidth, buttonHeight); 
     rhelp = new Rectangle(buttonWidthLocation, 450, buttonWidth, buttonHeight); 
     rmainMenu = new Rectangle(buttonWidthLocation, 600, buttonWidth, buttonHeight); 

     play.setBounds(rplay); 
     options.setBounds(roptions); 
     help.setBounds(rhelp); 
     mainMenu.setBounds(rmainMenu); 

     add(play); 
     add(options); 
     add(help); 
     add(mainMenu); 

     play.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Frame frame = new Frame(); 
       //need to remove this panel here 
       frame.ThreeD(); 
      } 
     }); 
     options.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("options"); 
      } 
     }); 
     help.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("help"); 
      } 
     }); 
     mainMenu.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("mainMenu"); 
      } 
     }); 
    } 
} 

И это мой класс рамы:

package Run; 

import javax.swing.*; 

import ThreeD.Display; 
import ThreeD.Launcher; 
import TowerDefence.Window; 


import java.awt.*; 
import java.awt.image.BufferedImage; 

public class Frame extends JFrame{ 

    public static String title = "Game";   

    /*public static int GetScreenWorkingWidth() { 
     return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; 
    }*/ 

    /*public static int GetScreenWorkingHeight() { 
     return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height; 
    }*/ 

    //public static Dimension size = new Dimension(GetScreenWorkingWidth(), GetScreenWorkingHeight()); 
    public static Dimension size = new Dimension(1280, 774); 


    public static void main(String args[]) { 
     Frame frame = new Frame(); 

     System.out.println("Width of the Frame Size is "+size.width+" pixels"); 
     System.out.println("Height of the Frame Size is "+size.height+" pixels"); 
    } 

    public Frame() { 
     setTitle(title); 
     setSize(size); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     ThreeDLauncher(); 
    } 

    public void ThreeDLauncher() {  
     Launcher launcher = new Launcher(); 
     add(launcher); 

     setVisible(true);  
    } 

    public void TowerDefence() { 
     setLayout(new GridLayout(1, 1, 0, 0)); 

     Window window = new Window(this); 
     add(window); 

     setVisible(true); 
    } 

    public void ThreeD() { 
     BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 
     Cursor blank = Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(0, 0), "blank"); 

     getContentPane().setCursor(blank); 

     Display display = new Display(); 
     add(display); 

     setVisible(true); 

     display.start(); 
    } 

} 
+0

'кадр кадр = новый кадр(); // ссылаясь на мой JFrame' Нет, это не так (либо 'JFrame' **, либо ** ссылка на исходный кадр). –

+2

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

Это ссылка на исходный JFrame, потому что этот класс является JPanel, и у меня есть другой класс для моего JFrame, поэтому мне нужно использовать его для вызова определенных методов в нем. – core16

ответ

2

В основном - вы создаете новый экземпляр Frame в строке:

Frame frame = new Frame(); //referencing to my JFrame class (this class is a JPanel) 

Новый экземпляр Frame не видно, а вы пытаетесь удалить ваш Launcher из не видимого нового Frame. Но это неправильно - вы должны удалить Launcher от Frame, который вы создали ранее в функции main (то есть: родительский компонент Launcher).

Здесь идет пример:

public class TestFrame extends JFrame { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestFrame frame = new TestFrame(); 
       frame.getContentPane().add(new MyPanel(frame)); 
       frame.setSize(200, 200); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 

    } 
} 

И MyPanel класс:

public class MyPanel extends JPanel { 
    public MyPanel(final TestFrame frame) { 
     JButton b = new JButton("Play"); 
     add(b); 
     b.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       Container pane = frame.getContentPane(); 
       pane.remove(MyPanel.this); 
       JPanel otherPanel = new JPanel(); 
       otherPanel.add(new JLabel("OtherPanel")); 
       pane.add(otherPanel); 
       pane.revalidate(); 
      } 
     }); 
    } 
} 

В вашем примере вы должны добавить ссылку на Frame в вашем Launcher конструктору:

public Launcher(Frame frame) { 
    this.frame = frame; 
    ... 

Init Launcher:

public void ThreeDLauncher() {  
    Launcher launcher = new Launcher(this); 

и использование:

play.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      //need to remove this panel here 
      frame.getContentPane().remove(Launcher.this); 
      frame.ThreeD(); 
     } 
    }); 
+0

Вы пропустили мой комментарий от 18 минут назад? ;) –

+0

Спасибо, после перемещения кода вокруг этого сработало. – core16

0

Произнесите панель myPanel вы можете удалить его из основной рамы путем:

frame.getContentPane().remove(myPanel); 
+0

сквозное окно [] проще всего, но +1 – mKorbel