动态添加按钮到JFrame或layeredPane

时间:2013-09-18 21:06:14

标签: java swing jframe jpanel layout-manager

public ChessGameDemo(){
Dimension boardSize = new Dimension(600, 600);

//  Using a Layered Pane 
layeredPane = new JLayeredPane();
add(layeredPane);
layeredPane.setPreferredSize(new Dimension(700,700));

//Create a reset button that will reset the game
JButton button = new JButton("Reset");
button.setPreferredSize(new Dimension(50,50));
add(button,BorderLayout.EAST);


//Add the chessboard to the Layered Pane 

chessBoard = new JPanel();
layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
chessBoard.setLayout( new GridLayout(8, 8) );
chessBoard.setPreferredSize( boardSize );
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);

for (int i = 0; i < 64; i++) {
    JPanel square = new JPanel( new BorderLayout() );
    chessBoard.add( square );

int row = (i / 8) % 2;
if (row == 0)
    square.setBackground( i % 2 == 0 ? Color.blue : Color.white );
else
    square.setBackground( i % 2 == 0 ? Color.white : Color.blue );
}

正如你在这里看到的,我正在一个面板中创建一个棋盘,并将其添加到一个分层窗格,而该窗格又是框架的一部分。我们的想法是拥有一个菜单栏和几个按钮,使它看起来更加美观。但是当我尝试添加按钮时,它会捕获框架的整个高度,忽略我指定的尺寸。我只看到一个高大的按钮拉伸窗户/框架的整个高度。这里有什么错误?如何动态添加正常大小的按钮?它坐在棋盘旁边?

1 个答案:

答案 0 :(得分:3)

  

但是当我尝试添加按钮时,它会捕捉到框架的整个高度,而忽略了我指定的尺寸。

这就是BorderLayout.EAST的工作方式。有关详细信息,请阅读Using Layout Managers上的Swing教程中的部分。

您可以随时嵌套布局管理器以获得所需的外观,例如:

JPanel east = new JPanel( new BorderLayout() );
JPanel buttons = new JPanel( new GridLayout(0, 1) );
east.add(buttons, BorderLayout.NORTH);
buttons.add( button1 );
buttons.add( button2 );
frame.add(east, BorderLayoutEAST);