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

将JLayerPane添加到JFrame时延迟

富涛
2023-03-14
public class Game_Screen extends JLayeredPane {
    
    private JLabel hangman;
    
    public Game_Screen() {
        super();
        super.setBounds(0, 0, 1920, 1080);
        
        hangman = new JLabel(new ImageIcon(Game_Screen.class.getResource("/images/hangman10.jpg")));
        hangman.setBounds(0, 0, 1920, 1080);
        
        add(hangman, Integer.valueOf(0));
    }
}
public class Home_Screen extends Game_Screen {
    
    private JLabel title;
    private JLabel score;
    private JButton start;
    
    public Home_Screen() {
        super();
        title = new JLabel("HANGMAN");
        title.setBounds(490, 170, 942, 217);
        title.setFont(new Font("Press Start", Font.PLAIN, 100));
        add(title, Integer.valueOf(1));
        
        score = new JLabel("High Score: 0");
        score.setBounds(635, 330, 470, 67);
        score.setFont(new Font("Press Start", Font.PLAIN, 30));
        add(score, Integer.valueOf(1));
        
        start = new JButton("START");
        start.setBounds(635,400,400,120);
        start.setBorderPainted(false);
        start.setFont(new Font("Press Start", Font.PLAIN, 60));
        add(start, Integer.valueOf(1));
    }
    
    public void addStartButtonListener(ActionListener a) {
        start.addActionListener(a);
    }
}
public class HangmanGame extends JFrame {
    
    private Home_Screen home;
    private Level_Screen level;
    private Win_Screen win;
    private Lose_Screen lose;
    private Play_Screen play;
    
    public HangmanGame() {
        super("Hangman");
        
        home = new Home_Screen();
        level = new Level_Screen();
        win = new Win_Screen();
        lose = new Lose_Screen();
        play = new Play_Screen();
        add(home);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(1920,1080));
        setLayout(null);
        setVisible(true);


    }
    
    public Home_Screen getHomeScreen() {
        return home;
    }
    
    public Level_Screen getLevelScreen() {
        return level;
    }
    
    public Win_Screen getWinScreen() {
        return win;
    }
    
    public Lose_Screen getLoseScreen() {
        return lose;
    }
    
    public Play_Screen getPlayScreen() {
        return play;
    }
}

控制器类

public class Controller {
    
    private HangmanGame game;
    
    public Controller() {
        //game = g;
        game = new HangmanGame();
        game.getHomeScreen().addStartButtonListener(new startButtonListener());
    }
    
    class startButtonListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            game.remove(game.getHomeScreen());
            game.add(game.getLevelScreen());
            
        }
        
    }

}

共有1个答案

夏令秋
2023-03-14

我要在这里惹你一点麻烦,坚持住,我相信你会感激的。

一是秋千偷懒。当您对组件或布局进行更改时,您需要告诉Swing您希望对其进行更新。

这意味着,添加或删除组件时,通常会调用revalidaterepaint。由于没有大量使用布局管理器,因此可以保留revalidate

取而代之的是,我想让事情尽可能地变得愚蠢,所以如果我需要改变事情,并不是每次都完全重写。

相反,在下面的示例中,我在HangmanGame上使用了CardLayout并为Home_Screen提供了一个“委托”,它告诉“开始”何时发生(我不关心如何发生,只是它发生了),然后允许HangmanGame控制导航。

这通常是一个小事情,你可以争辩说可以使用某种“导航控制器”,但你需要在away中这样做,这确实暴露了实现细节,而且...这是一个混乱的...:p

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Controller {

    private HangmanGame game;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Controller();
            }
        });
    }

    public Controller() {
        //game = g;
        game = new HangmanGame();
    }

    public class HangmanGame extends JFrame {

        private Home_Screen home;
        private JPanel level;

        public HangmanGame() {
            super("Hangman");

            CardLayout cardLayout = new CardLayout();

            home = new Home_Screen(new HomeDelegate() {
                @Override
                public void startGame() {
                    cardLayout.show(getContentPane(), "level");
                }
            });
            level = new JPanel();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(new Dimension(1920, 1080));
            setLayout(cardLayout);
            add(home, "home");
            add(level, "level");
            setVisible(true);

        }
    }

    public interface HomeDelegate {

        public void startGame();
    }

    public class Home_Screen extends Game_Screen {

        private JLabel title;
        private JLabel score;
        private JButton start;

        public Home_Screen(HomeDelegate delegate) {
            super();
            title = new JLabel("HANGMAN");
            title.setBounds(490, 170, 942, 217);
            title.setFont(new Font("Press Start", Font.PLAIN, 100));
            add(title, Integer.valueOf(1));

            score = new JLabel("High Score: 0");
            score.setBounds(635, 330, 470, 67);
            score.setFont(new Font("Press Start", Font.PLAIN, 30));
            add(score, Integer.valueOf(1));

            start = new JButton("START");
            start.setBounds(635, 400, 400, 120);
            start.setBorderPainted(false);
            start.setFont(new Font("Press Start", Font.PLAIN, 60));
            add(start, Integer.valueOf(1));

            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    delegate.startGame();
                }
            });
        }
    }

    public class Game_Screen extends JLayeredPane {

        private JLabel hangman;

        public Game_Screen() {
            super();

            hangman = new JLabel(new ImageIcon(getClass().getResource("/images/hangman10.png")));
            hangman.setBounds(0, 0, 1920, 1080);

            add(hangman, Integer.valueOf(0));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(1920, 1080);
        }
    }
}
 类似资料:
  • 我正在尝试将此 JPanel 添加到 JFrame 中,但我看不到他。当我创建新的 java 类并自己制作这个框架时,一切都很好。 来自JFrame表单的代码。 来自 JPanel 的代码: 来自Java类的代码。 我想不出区别在哪里。有人能帮我吗?

  • 我在向JFrame添加JLabel时遇到问题。我使用了一些教程中描述的JPanel,但标签不会在框架中弹出;其他swing组件(如JTextField、JButton等)也存在同样的问题。。绘制直线、矩形等确实可行。我希望有人知道,我在这里犯了什么样的错误: 主方法位于另一个类中: 框架按预期弹出,但JLabel丢失。感谢所有有用的评论。

  • 我有一个关于向Java框架添加组件的问题。 我有一个带有两个按钮的JGroup和一个添加了JTable的JScrollPane。我想将这两个都添加到JFrame中。 我可以将JPanel添加到JFrame,或者将JScrollPane添加到JFrame,并且它们可以正确显示。我很难将它们都添加到JFrame并显示它们。 是否有与JFrames相关的东西不允许这样做?任何帮助都将不胜感激。 编辑 问

  • 我正在创建一个TicTacToe游戏。我把所有带有ActionListeners的后端放在按钮上,将按钮添加到面板,设置框架等等。 然而,当我运行程序时,我的JPanel似乎没有添加到JFrame中。我试过使用不同的布局,仔细检查是否确实放置了。为所有内容添加行,之前的所有帖子似乎都指向了我认为已经涵盖的内容。 如果这真的很直接,我提前道歉。 谢谢你的帮助。

  • 问题内容: 我有两节课 我的主要班级创建了一个框架,我希望另一个班级为其添加内容。一读arroudn告诉我,我应该使用组件来执行此操作,但是当我运行代码时,框架为空。 我的Component类创建一个JLabel 我没有任何编译错误,但是我的JFrame中没有任何文本。 谁能解释我在做什么错? 克里斯 问题答案: 您需要 添加 的。最好扩展而不是扩展,因为它具有默认的布局管理器,并且无需设置组件大

  • 我一直在使用JFrame进行我的项目,但遇到了一个问题。这是我的代码: 还有,这是我的主要。java: 我想做的是向面板添加文本字段和标签。但是,当我运行此代码时,它会显示:结果 如果我在框架中添加标签和文本字段,效果很好。你能帮我解决这个问题吗?非常感谢你。