[英]initializing more than one JFrame creates blank JFrames
我是Swing的新手,無法替換現有的JFrame。 我初始化第一個JFrame沒問題...
主要:
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並嘗試初始化其他JFRame ...
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);
}
我認識到我的方法有點不合常規,但是我正在嘗試在並非為搖擺設計的代碼的局限性內工作(並且必須在很大程度上保持原樣)。 任何幫助將不勝感激!
編輯
我已經修改了我的代碼以模仿Vince以及以下功能:
public static void update(/*New Values*/) {
frame.remove(pp);
secondPanel = new SecondPanel(/*New Values*/);
frame.add(pp, "secondPanel");
switchPanel("secondPanel");
不幸的是,調用更新后,框架沒有從原始MainMenu框架切換。 有任何想法嗎?
不要初始化新框架。 如果要從一個面板切換到另一個面板,請將框架的布局設置為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問題
我還建議調查游戲狀態。 當涉及到游戲時,這是另一個大問題。 它允許您根據游戲所處的狀態(菜單,游戲,暫停等)來渲染/更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.