java board 大小调整_制作一个健壮的、可调整大小的Swing Chess GUI

我注意到,当调整大小时,棋盘和右边/Botton线边框之间会有一个很小的间隙。这发生在GridLayout中,因为空间并不总是可以被9整除的。

您可能正在寻找使用标准JDK的解决方案,但是如果您想要消除这个小差距,则可以使用相对布局管理棋盘和棋盘。这个差距仍然存在,但是我已经把它移到标签上了,所以你很难看出区别。import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import javax.swing.*;import javax.swing.border.*;

import java.net.URL;import javax.imageio.ImageIO;public class ChessGUI2 {

private final JPanel gui = new JPanel(new BorderLayout(3, 3));

private JButton[][] chessBoardSquares = new JButton[8][8];

private Image[][] chessPieceImages = new Image[2][6];

private JPanel chessBoard;

private final JLabel message = new JLabel(

"Chess Champ is ready to play!");

private static final String COLS = "ABCDEFGH";

public static final int QUEEN = 0, KING = 1,

ROOK = 2, KNIGHT = 3, BISHOP = 4, PAWN = 5;

public static final int[] STARTING_ROW = {

ROOK, KNIGHT, BISHOP, KING, QUEEN, BISHOP, KNIGHT, ROOK    };

ChessGUI2() {

initializeGui();

}

public final void initializeGui() {

// create the images for the chess pieces

createImages();

// set up the main GUI

gui.setBorder(new EmptyBorder(5, 5, 5, 5));

JToolBar tools = new JToolBar();

tools.setFloatable(false);

gui.add(tools, BorderLayout.PAGE_START);

Action newGameAction = new AbstractAction("New") {

@Override

public void actionPerformed(ActionEvent e) {

setupNewGame();

}

};

tools.add(newGameAction);

tools.add(new JButton("Save")); // TODO - add functionality!

tools.add(new JButton("Restore")); // TODO - add functionality!

tools.addSeparator();

tools.add(new JButton("Resign")); // TODO - add functionality!

tools.addSeparator();

tools.add(message);

gui.add(new JLabel("?"), BorderLayout.LINE_START);//        chessBoard = new JPanel(new GridLayout(0, 9)) {

chessBoard = new JPanel() {

/**

* Override the preferred size to return the largest it can, in

* a square shape.  Must (must, must) be added to a GridBagLayout

* as the only component (it uses the parent as a guide to size)

* with no GridBagConstaint (so it is centered).

*/

@Override

public final Dimension getPreferredSize() {

Dimension d = super.getPreferredSize();

Dimension prefSize = null;

Component c = getParent();

if (c == null) {

prefSize = new Dimension(

(int)d.getWidth(),(int)d.getHeight());

} else if (c!=null &&

c.getWidth()>d.getWidth() &&

c.getHeight()>d.getHeight()) {

prefSize = c.getSize();

} else {

prefSize = d;

}

int w = (int) prefSize.getWidth();

int h = (int) prefSize.getHeight();

// the smaller of the two sizes

int s = (w>h ? h : w);

return new Dimension(s,s);

}

};

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);

rl.setRoundingPolicy( RelativeLayout.FIRST );

rl.setFill(true);

chessBoard.setLayout( rl );

chessBoard.setBorder(new CompoundBorder(

new EmptyBorder(8,8,8,8),

new LineBorder(Color.BLACK)

));

// Set the BG to be ochre

Color ochre = new Color(204,119,34);

chessBoard.setBackground(ochre);

JPanel boardConstrain = new JPanel(new GridBagLayout());

boardConstrain.setBackground(ochre);

boardConstrain.add(chessBoard);

gui.add(boardConstrain);

// our chess pieces are 64x64 px in size, so we'll

// 'fill this in' using a transparent icon..

ImageIcon icon = new ImageIcon(

//new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));

new BufferedImage(48, 48, BufferedImage.TYPE_INT_ARGB));

// create the chess board squares

Insets buttonMargin = new Insets(0, 0, 0, 0);

for (int ii = 0; ii 

for (int jj = 0; jj 

JButton b = new JButton();

b.setMargin(buttonMargin);

b.setIcon(icon);

if ((jj % 2 == 1 && ii % 2 == 1)

//) {

|| (jj % 2 == 0 && ii % 2 == 0)) {

b.setBackground(Color.WHITE);

} else {

b.setBackground(Color.BLACK);

}

chessBoardSquares[jj][ii] = b;

}

}

/*

* fill the chess board

*/

RelativeLayout topRL = new RelativeLayout(RelativeLayout.X_AXIS);

topRL.setRoundingPolicy( RelativeLayout.FIRST );

topRL.setFill(true);

JPanel top = new JPanel( topRL );

top.setOpaque(false);

chessBoard.add(top, new Float(1));

top.add(new JLabel(""), new Float(1));

// fill the top row

for (int ii = 0; ii 

JLabel label = new JLabel(COLS.substring(ii, ii + 1), SwingConstants.CENTER);

top.add(label, new Float(1));

}

// fill the black non-pawn piece row

for (int ii = 0; ii 

RelativeLayout rowRL = new RelativeLayout(RelativeLayout.X_AXIS);

rowRL.setRoundingPolicy( RelativeLayout.FIRST );

rowRL.setFill(true);

JPanel row = new JPanel( rowRL );

row.setOpaque(false);

chessBoard.add(row, new Float(1));

for (int jj = 0; jj 

switch (jj) {

case 0:

row.add(new JLabel("" + (9-(ii + 1)), SwingConstants.CENTER), new Float(1));

default:

row.add(chessBoardSquares[jj][ii], new Float(1));

}

}

}

}

public final JComponent getChessBoard() {

return chessBoard;

}

public final JComponent getGui() {

return gui;

}

private final void createImages() {

try {

URL url = new URL("http://i.stack.imgur.com/memI0.png");

BufferedImage bi = ImageIO.read(url);

for (int ii = 0; ii 

for (int jj = 0; jj 

chessPieceImages[ii][jj] = bi.getSubimage(//                            jj * 64, ii * 64, 64, 64);

jj * 64, ii * 64, 48, 48);

}

}

} catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

}

/**

* Initializes the icons of the initial chess board piece places

*/

private final void setupNewGame() {

message.setText("Make your move!");

// set up the black pieces

for (int ii = 0; ii 

chessBoardSquares[ii][0].setIcon(new ImageIcon(

chessPieceImages[0][STARTING_ROW[ii]]));

}

for (int ii = 0; ii 

chessBoardSquares[ii][1].setIcon(new ImageIcon(

chessPieceImages[0][PAWN]));

}

// set up the white pieces

for (int ii = 0; ii 

chessBoardSquares[ii][6].setIcon(new ImageIcon(

chessPieceImages[1][PAWN]));

}

for (int ii = 0; ii 

chessBoardSquares[ii][7].setIcon(new ImageIcon(

chessPieceImages[1][STARTING_ROW[ii]]));

}

}

public static void main(String[] args) {

Runnable r = new Runnable() {

@Override

public void run() {

ChessGUI2 cg = new ChessGUI2();

JFrame f = new JFrame("ChessChamp");

f.add(cg.getGui());

// Ensures JVM closes after frame(s) closed and

// all non-daemon threads are finished

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

// See http://stackoverflow.com/a/7143398/418556 for demo.

f.setLocationByPlatform(true);

// ensures the frame is the minimum size it needs to be

// in order display the components within it

f.pack();

// ensures the minimum size is enforced.

f.setMinimumSize(f.getSize());

f.setVisible(true);

}

};

// Swing GUIs should be created and updated on the EDT

// http://docs.oracle.com/javase/tutorial/uiswing/concurrency

SwingUtilities.invokeLater(r);

}}

它确实需要更多的工作,因为您需要单独管理行,而不是在网格中。此外,我还更改了使用48x48映像的代码,以使测试在我的小型监视器上更容易调整大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值