当前位置: 首页 > 知识库问答 >
问题:

从JPanel中移除JPanel -仅适用于它自己的类

艾泰
2023-03-14

关于这个有很多问题,但他们都提出了重新验证的东西……我的代码在一个类中工作,但如果它从另一个类触发则不工作。

我有一个JPanel,我想添加一个JPanel。

我有一个方法start Game()女巫应该删除当前添加到它的面板。

方法 startGame() 的工作原理,如果我直接从构造函数调用它。

如果我从另一个类调用startGame()方法,它将无法工作。

public TopMenu topMenu;
public JPanel welcomeScreen;
public JPanel gameScreen;

public WelcomePanel() {
    setLayout(null);
    setSize(1000, 700);

    init();

    setBackground(Color.ORANGE);
}

public void init() {
    topMenu = new TopMenu(this);
    welcomeScreen = new WelcomeScreen();
    gameScreen = new Game();

    add(topMenu);
    add(this.welcomeScreen);
}

public void startGame() {
    remove(this.welcomeScreen);
    add(gameScreen);
    revalidate();
}

因此,如果在init之后,我调用startGame(),它就会工作,并且移除welcomeScreen并添加gameScreen。

如果我从topMenu中的动作听者中调用它,它不会做任何事情。Neighter 删除旧面板,或在旧面板上添加新面板。

其他类:

欢迎窗口

public class WelcomeScreen extends JPanel {
    public WelcomeScreen()
    {
        setBounds(0, 50, GameBase.gameWidth, GameBase.gameHeight - 50);
        setBackground(Color.GREEN);
    }
}

游戏

public class Game extends JPanel {

    public Image background;

    public Game()
    {

        background = new ImageIcon("src/game/images/mainMenu/MainMenu.png").getImage();

        setBounds(50, 50, 700, 650);
        setBackground(Color.GREEN);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(background, 0, 0, null);
    }
}

TopMenu(基本上:actionlistener在按钮上调用startGame方法-测试并工作。)

public class TopMenu extends JPanel implements ActionListener {

    public topMenuButton playButton;
    public topMenuButton forwardButton;
    public topMenuButton menuButton;
    public topMenuButton goToTheGameButton;

    public Image background;

    public static boolean playingNow = false;
    public static boolean changingSettings = false;
    public static boolean inTheMenu = true;

    WelcomePanel welcomePanel;

    public TopMenu(WelcomePanel welcomePanel) {
        this.welcomePanel = welcomePanel;

        background = new ImageIcon("src/game/images/TopBalk/Topbalk.png").getImage();

        setLayout(null);

        setSize(new Dimension(1000, 50));
        setBackground(Color.GRAY);

        setButtons();
    }

    public void setButtons() {
        //initialise all buttons
        playButton = new topMenuButton("src/game/images/TopBalk/Play_Button.png", "src/game/images/TopBalk/PlayGlow_Button.png", 110, 9, 43, 48, 0, "", 30, 34);
        forwardButton = new topMenuButton("src/game/images/TopBalk/Forward_Button.png", "src/game/images/TopBalk/ForwardGlow_Button.png", 150, 9, 59, 48, 0, "", 30, 34);
        menuButton = new topMenuButton("src/game/images/TopBalk/Menu_Button.png", "src/game/images/TopBalk/MenuGlow_Button.png", 20, 4, 109, 48, 0, "", 38, 86);
        goToTheGameButton = new topMenuButton("src/game/images/TopBalk/goToTheGame_Button_needsRework.gif", "src/game/images/TopBalk/goToTheGameGlow_Button_needsRework.gif", 400, 4, 109, 48, 0, "", 38, 86);

        //add actionlisteners to buttons
        playButton.addActionListener(this);
        forwardButton.addActionListener(this);
        menuButton.addActionListener(this);
        goToTheGameButton.addActionListener(this);

        //add buttons that are needed now
        addUsefulButtons();
    }

    public void addUsefulButtons() {
        //add the usefull buttons

        if (playingNow) {
            add(playButton);
            add(forwardButton);
        }
        if (inTheMenu) {
            add(goToTheGameButton);
        }
        if(!inTheMenu){
            add(menuButton);
        }
        if(changingSettings)
        {

        }
    }

    public void removeButtons() {
        remove(playButton);
        remove(forwardButton);
        remove(menuButton);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //If the player hits play or pause
        if (e.getSource().toString().contains("Play") || e.getSource().toString().contains("Pauze")) {
            //change the pause state of the game
            GameLoop.paused = !GameLoop.paused;
            //check if the game is paused
            if (GameLoop.paused)
                //change the play button image
                playButton.setImage("src/game/images/TopBalk/Pauze_Button.png", "src/game/images/TopBalk/PauzeGlow_Button.png");
            else {
                //change the play button image
                playButton.setImage("src/game/images/TopBalk/Play_Button.png", "src/game/images/TopBalk/PlayGlow_Button.png");
            }
            //if the player hits fast forward
        } else if (e.getSource().toString().contains("Forward")) {
            //do stuff to fast forward
            System.out.println("Forward");
        }
        //if the player hits the menu button
        else if (e.getSource().toString().contains("Menu_Button.png")) {
            //do stuff to show the menu
            System.out.println("Menu");
        }
        //if the goToTheGame button is pressed
        else if (e.getSource().toString().contains("goToTheGame")){
            welcomePanel.startGame();
        }
        //if there is no recognised action command
        else{

            //just display a message in the console.. WTF??
            System.out.println("TopMenuActionlistener has unknown potentials!! Check the actionPerformed plz..");
        }
    }

    public void paintComponent(Graphics g) {
        g.drawImage(background, 0, 0, null);
    }
}

共有1个答案

杜骏祥
2023-03-14

验证一个组件意味着列出它的子组件,如果它们需要移动,它会重新绘制它们。因为你使用的是绝对定位而不是布局管理器,这对你没有任何帮助。

不要调用重新验证 (),而是调用重绘 ()

 类似资料:
  • 问题内容: 我正在尝试制作一个游戏引擎。我已经制作了Game类,但错误仍在KeyBoard类中。在这里我留下一些代码。 类别::游戏 类::键盘 类别:: KeyTest 但是错误是没有抛出异常并且输入没有被读取。谁能说我这样做的正确方法。 问题答案: 简而言之,您的面板需要专注。在创建面板的任何地方添加: 这是一个SSCCE(我建议以后再问其中一个问题): 另外,https://www.goog

  • 有人能告诉我为什么这也不管用吗?(我的第二个动作监听器是我的游戏所需的其他东西)

  • 专家们,需要一些帮助。 执行的JCheckBox操作(在类'A'中)如下所示, 先说一些细节: =扩展JPanel并添加到JTabbedPane的类,即类B

  • 更新:带有XYPlot的JPanel封装在JSplitPanel中。当我移动分隔符(用XYPlot放大JPanel)时,有两个XYPlot,第一个(在第一次单击时获得,第二个(如果第二次单击到另一个行/dataset->XYPlot)。

  • 问题内容: 当我需要时会出现一个新的JPanel(超过了时间限制或用户按下了“提交”按钮)。但是几秒钟后,旧的JPanel的某些元素就会与新的JPanel的组件一起出现。我不明白为什么会这样。 我以为是因为我必须对其他线程更新窗口。但是第一个线程只需将旧面板添加一次(因此,应该完成)。在第二个线程中,我有一个中断的循环(因此,它也应该完成)。 这是我的代码: 问题答案: 从容器(框架)中删除组件(

  • 但是,我的程序稍后尝试将一个新的JPanel添加到类的扩展JPanel中,方法是: 这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占用整个屏幕。将布局设置为null将完全破坏框架,除了框架的最小化和关闭按钮之外,什么也没有出