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

初始化多个JFrame将创建空白JFrame

封俊艾
2023-03-14
public static JFrame jf;
public static int state = 0;

public static void main(String args[]) {
    jf = new MainMenu();
    jf.setVisible(true);
    while (state != -1) {}  
}
public MainMenu() {
    setTitle("Battleship");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);

    JButton btnSinglePlayer = new JButton("Single Player - Easy");
    btnSinglePlayer.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            GameDriver gd = new GameDriver(1);
        }
    });

    JButton btnSplitScreenMultiplayer = new JButton("Split Screen Multiplayer");
    btnSplitScreenMultiplayer.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            GameDriver gd = new GameDriver(0);
        }
    });

    JButton btnOnlineMultiplayer = new JButton("Online Multiplayer");
    btnOnlineMultiplayer.setEnabled(false);

    JButton btnHowToPlay = new JButton("How to Play");
    btnHowToPlay.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (Desktop.isDesktopSupported()) {
                try {
                     //Set your page url in this string. For eg, I m using URL for Google Search engine
                     String url = "http://www.hasbro.com/common/instruct/battleship.pdf";
                     java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
                   }
                   catch (java.io.IOException e2) {
                       System.out.println(e2.getMessage());
                   }
            }
        }
    });
    GroupLayout gl_contentPane = new GroupLayout(contentPane);
    gl_contentPane.setHorizontalGroup(
        gl_contentPane.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
                .addContainerGap(128, Short.MAX_VALUE)
                .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
                    .addComponent(btnHowToPlay, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnOnlineMultiplayer, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnSinglePlayer, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnSplitScreenMultiplayer, Alignment.LEADING))
                .addGap(121))
    );
    gl_contentPane.setVerticalGroup(
        gl_contentPane.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
                .addContainerGap(89, Short.MAX_VALUE)
                .addComponent(btnSinglePlayer)
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(btnSplitScreenMultiplayer)
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(btnOnlineMultiplayer)
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(btnHowToPlay)
                .addGap(45))
    );
    contentPane.setLayout(gl_contentPane);
}

GamedRiver:

//Stuff Happens
ProgramShell.jf.setVisible(false);
ProgramShell.jf = new PlacementWindow(currentPlayer, otherPlayer, curShip);
ProgramShell.jf.setVisible(true);

我得到一个没有所有组件的空白JFrame(当我使用PlacementWindow的main初始化时,它被正确创建)

PlacementWindow:

private JPanel contentPane;
private GameBoard gbCur;
private GameBoard gbOth;
private int curPlacement;
private String title;
private int sqSize = 21;
private int xOffset = 27;
private int yOffset = 27;
private int divOffset = 283;

public PlacementWindow(GameBoard cur, GameBoard oth, int curShip) {
    this.gbCur = cur;
    this.gbOth = oth;
    this.curPlacement = curShip;
    title = "Battleship! " + cur.getName() + ", place your ships";

    setTitle(title);
    setBounds(100, 100, 518, 389);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);

    //Stuff added to Content Pane

    ImagePanel leftBoard = new ImagePanel("graphicsAssets/boardGraphic.png");
    leftBoard.setBounds(6, 6, 250, 250);
    getContentPane().add(leftBoard);

            //More stuff added to Content Pane

    contentPane.setLayout(null);
}
public static void update(/*New Values*/) {
   frame.remove(pp);
   secondPanel = new SecondPanel(/*New Values*/);
   frame.add(pp, "secondPanel");
   switchPanel("secondPanel");

不幸的是,在调用Update时,该帧不会从原始MainMenu帧切换。有什么想法吗?

共有1个答案

左丘成天
2023-03-14

不要初始化新帧。如果您想从一个面板切换到另一个面板,请将框架的布局设置为CardLayout,并添加JPanels。

class MyFrame {

    static CardLayout cl = new CardLayout(); //handles panel switching

    static JFrame frame; //init swing on EDT
    static FirstPanel firstPanel;
    static SecondPanel secondPanel;

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

    public static void initFrame() {
         SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                   frame = new JFrame();
                   frame.setDefaultCloseOperation(3);
                   frame.setLayout(cl);

                   firstPanel = new FirstPanel();
                   secondPanel = new SecondPanel();


                   //first panel added to frame will always show first
                   frame.add(firstPanel, "first");
                   frame.add(secondPanel, "second");
                   frame.pack(); //sizes frame to fit the panel being shown

                   setVisible(true);
              }
         });
    }

    public static void switchPanel(String name) {
         cl.show(frame.getContentPane(), name);
         frame.pack();
    }
}   

class FirstPanel extends JPanel { }
class SecondPanel extends JPanel { }

您使用面板,因此如果需要,您可以切换/处置/创建面板,而不是整个框架。

但是,至于游戏,他们不使用面板方法。游戏使用1个面板,取而代之。如果这对您没有意义,我用一个简单的游戏设计回答了另一个问题:JFrame、JPanel、KeyListener问题

 类似资料:
  • 我使用FFMPEG-segment对桌面上的视频捕获进行分段,并通过网络发送它们,以便提供给客户,并使用dash.js播放。问题是播放器正在搜索初始化段,而我似乎不知道如何创建它。 我使用以下ffmpeg命令创建段: 我为流创建的清单如下所示: 播放机调试模式打印以下内容: 如何为生成的段创建初始化段?我似乎无法让它起作用。

  • 我希望转换之间的HLS和MPEG破折号。我不能访问原始的完全串联的视频文件,只有个别的HLS段。 在进行到MPEG破折号的转换时,我需要为破折号manifest.mpd文件提供一个初始化段。 我的问题是: null 非常感谢。 更新:使用原始hls段的流代码段。视频一直在播放,但只是黑色的。

  • 问题内容: 在将java.util.Date变量初始化为空时,我需要您的帮助。当我运行页面时,如果我没有选择任何日期,它将显示nullpointerexception。 代码是: 我试图使该变量为空,但是它不起作用> 但是,使用初始化: 上面的代码会给我一个我不想要的默认值。 问题答案: java.util.Date的 实例存储一个日期。那么,如何在其中什么也不存储呢?它只能存储对实例的引用。如果

  • 我想使用Spring初始值设定项为tomcat创建WAR… 我们的DevOp仍然不习惯将java作为独立运行的想法,并且希望在tomcat中将应用程序作为WAR 我能够产生一个项目,但它似乎产生了一个独立的Spring启动应用程序 我仍然想使用Spring Launalizr来生成所有依赖项,例如: Rest存储库 JDBC模板 石英 Rest 一种解决方案是在eclipse中创建一个动态web项

  • 问题内容: 这非常丑陋: 有没有办法在一行上声明这些变量? 问题答案: 上述方法的缺点是,您需要计算左侧的名称数,并且在右侧具有完全相同数量的空列表(例如,通过调用或更明确地)。 最主要的是, 不要 使用类似 也不 这将使所有名称都引用 相同的 空列表!

  • windows操作系统下无法在一个php文件里初始化多个Worker, 例如下面test.php <?php ... $socket_server = new Worker("tcp://0.0.0.0:5555"); $socket_server->on.... $websocket_server = new Worker("websocket://0.0.0.0:6666"); $websoc