我有一个JFrame,有一个主GamePanel:
import javax.swing.*;
public class GameFrame extends JFrame {
public static void main(String[] args) {
JFrame gameFrame = new JFrame( "Ultimate Tic Tac Toe");
gameFrame.setResizable(false);
gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gameFrame.add( new GamePanel() );
gameFrame.pack();
gameFrame.setVisible(true);
}
}GamePanel有一个BorderLayout,我有一个setPreferredSize(new Dimension(800,800)):
公共类GamePanel扩展JPanel实现ActionListener {
private BoardPanel boardPanel; //the main game, comprised of minigames
private static TrackingPanel trackingPanel; //keeps track of score, turn, and stuff
private ArrayList<MiniGame> miniGames;
public GamePanel() {
super( new BorderLayout());
setFocusable(true);
setPreferredSize(new Dimension(800,800));
//create panel that will hold the 9 mini games
boardPanel = new BoardPanel(this);
//add actionListeners to each button
miniGames = boardPanel.getMiniGames();
for (MiniGame mini : miniGames) {
for (SquareButton button : mini.getSquares())
button.addActionListener(this);
}
add( trackingPanel, BorderLayout.NORTH);
add( boardPanel, BorderLayout.CENTER);
}//end constructor中心是my BoardPanel,它有一个GridLayout(3,3),所以BoardPanel有9个子MiniGame JPanels。这里是我的问题:像下面这样添加MiniGames很好,但是由于某种原因,它们被推送到父BoardPanel和窗口之外显示。理想情况下,我希望在不改变布局的情况下这样做,因为我知道它们以前是工作过的。这是BoardPanel的代码。
import java.awt.*;
import java.util.ArrayList;
import javax.swing.JPanel;
public class BoardPanel extends JPanel {
private ArrayList<MiniGame> miniGames;
public BoardPanel(GamePanel gp) {
super(new GridLayout(3,3));
setBorder(BorderFactory.createEmptyBorder(200,200,200,200));
miniGames = new ArrayList<MiniGame>(9);
for(int i = 1; i<=9; i++)
miniGames.add(new MiniGame(gp, i));
for(MiniGame mini : miniGames)
add(mini);
}我知道所有的面板都是添加和显示(我检查通过改变他们的边框厚度。此外,增加空边框大小会显示更多的MiniGame面板)。因此,与其像网格一样显示:
1 2 3
4 5 6
7 8 9它们呈对角线向下显示:
1
2
3
...其馀部分在父面板之外。
如果这有帮助的话,下面是MiniGame构造函数:
public MiniGame(GamePanel gp, int num) {
super( new GridLayout(3,3));
setFocusable(true);
trackingPanel = gp.getTrackingPanel();
panelNum = num;
if(panelNum==1)
setBorder(BorderFactory.createMatteBorder(0,0,2,2,Color.BLACK));
else if(panelNum==2)
setBorder(BorderFactory.createMatteBorder(0,2,2,2,Color.BLACK));
else if(panelNum==3)
setBorder(BorderFactory.createMatteBorder(0,2,2,0,Color.BLACK));
else if(panelNum==4)
setBorder(BorderFactory.createMatteBorder(2,0,2,2,Color.BLACK));
else if(panelNum==5)
setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK));
else if(panelNum==6)
setBorder(BorderFactory.createMatteBorder(2,2,2,0,Color.BLACK));
else if(panelNum==7)
setBorder(BorderFactory.createMatteBorder(2,0,0,2,Color.BLACK));
else if(panelNum==8)
setBorder(BorderFactory.createMatteBorder(2,2,0,2,Color.BLACK));
else
setBorder(BorderFactory.createMatteBorder(2,2,0,0,Color.BLACK));
squares = new SquareButton[9];
//create squares and add squares to mini game
for ( int i = 0; i < squares.length; i++ ) {
squares[i] = new SquareButton(i);
add(squares[i]);
}
}谢谢大家!
发布于 2013-07-08 19:08:11
回溯工作时,我意识到这是我调用了getX()和getY()的两个函数。我猜这是JPanels的默认函数,我正在重写它们。
发布于 2013-07-08 19:12:46
"MiniGame构造函数“显示调用{ add (squaresi);},但没有显示add在MiniGame中的作用。因为您没有显示它的所有代码,所以我们不知道它扩展了什么。如果它本身是一个UI类,那么您的问题可能是在该容器中活动的布局管理器,不管它是什么。
https://stackoverflow.com/questions/17533412
复制相似问题