如何在JFrame中调整这些面板的大小?

腺苷

我正在创建一个国际象棋游戏,其主面板使用BorderLayout,面板上有NORTH用于按钮的面板,面板上有CENTER用于棋盘本身的面板(设置为GridLayout),还有侧边栏位于East

我已经使JFrame不可调整大小,并且我希望棋盘适合面板,以使East面板更宽(也许200像素),而board其余部分仍为正方形。我不知道如何分别更改这些组件的大小。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class GameWindow extends JFrame {

    private final JPanel playArea = new JPanel(new BorderLayout(3,3));
    private final JButton[][] boardSquares = new JButton[8][8];
    private final JPanel board;
    private final JPanel sidebar = new JPanel();
    private final JLabel message = new JLabel("Game by ...");

    public  GameWindow() {
        playArea.setBorder(new EmptyBorder(5, 5, 5, 5));

        JToolBar tools = new JToolBar();


        tools.setFloatable(false);
        playArea.add(tools, BorderLayout.PAGE_START);
        tools.add(new JButton("New Game"));
        tools.add(new JButton("Save"));
        tools.add(new JButton("Restore")); 
        tools.addSeparator();
        tools.add(new JButton("Resign"))
        tools.addSeparator();
        tools.add(message);

        board = new JPanel(new GridLayout(0, 8));
        board.setBorder(new LineBorder(Color.BLACK));
        playArea.add(board, BorderLayout.CENTER);
        playArea.add(sidebar, BorderLayout.EAST);

        Insets buttonMargin = new Insets(0,0,0,0);
        for (int i = 0; i < boardSquares.length; i++) {
           for (int j = 0; j < boardSquares[i].length; j++) {
                JButton square = new JButton();
                square.setMargin(buttonMargin);
                if ((i+j)%2 == 0) {
                    square.setBackground(Color.WHITE);
                } 
                else {
                    square.setBackground(Color.BLACK);
                }
                board.setSize(600, 600);
                board.add(boardSquares[j][i] = square);
            }
        }
    }

    public final JComponent getChessBoard() {
    return board;
    }

    public final JComponent getGui() {
        return playArea;
    }

    public static void main(String[] args) {

        GameWindow window = new GameWindow();

        JFrame frame = new JFrame("Checkers");
        frame.setResizable(false);
        frame.add(window.getGui());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setSize(800, 800);

        frame.setVisible(true);
    }
}
细线

首先,由于JDK 1.4,Java正在鼓励使用BorderLayout常量BorderLayout.PAGE_STARTBorderLayout.LINE_STARTBorderLayout.CENTERBorderLayout.LINE_ENDBorderLayout.PAGE_END在后者的使用你。

其次,您可以简单地重写saidgetPreferredSize()JPanel,以便提供给您一些适合您的用例的大小。setPreferredSize()限制使用,因为并非所有LayoutManager都遵循它指定的Dimension。

因此,您可以执行以下操作:

private final JPanel sidebar = new JPanel() {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }
};

您可以尝试以下修改的代码:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class GameWindow extends JFrame {

    private final JPanel playArea = new CustomPanel(710, 710);  
    private final JButton[][] boardSquares = new JButton[8][8];
    private final JPanel board;
    private final JPanel sidebar = new CustomPanel(100, 100);
    private final JLabel message = new JLabel("Game by ...");

    public  GameWindow() {
        playArea.setLayout(new BorderLayout(3,3));
        playArea.setBorder(new EmptyBorder(5, 5, 5, 5));

        JToolBar tools = new JToolBar();


        tools.setFloatable(false);
        playArea.add(tools, BorderLayout.PAGE_START);
        tools.add(new JButton("New Game"));
        tools.add(new JButton("Save"));
        tools.add(new JButton("Restore")); 
        tools.addSeparator();
        tools.add(new JButton("Resign"));
        tools.addSeparator();
        tools.add(message);

        board = new CustomPanel(600, 600);
        board.setLayout(new GridLayout(0, 8));
        board.setBorder(new LineBorder(Color.BLACK));
        playArea.add(board, BorderLayout.CENTER);
        playArea.add(sidebar, BorderLayout.LINE_START);

        Insets buttonMargin = new Insets(0,0,0,0);
        for (int i = 0; i < boardSquares.length; i++) {
           for (int j = 0; j < boardSquares[i].length; j++) {
                JButton square = new JButton();
                square.setOpaque(true);
                square.setMargin(buttonMargin);
                if ((i+j)%2 == 0) {
                    square.setBackground(Color.WHITE);
                } 
                else {
                    square.setBackground(Color.BLACK);
                }
                board.add(boardSquares[j][i] = square);
            }
        }
    }

    private class CustomPanel extends JPanel {
        private int width;
        private int height;

        public CustomPanel(int width, int height) {
            this.width = width;
            this.height = height;
            setOpaque(true);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(width, height);
        }
    }

    public final JComponent getChessBoard() {
    return board;
    }

    public final JComponent getGui() {
        return playArea;
    }

    public static void main(String[] args) {

        GameWindow window = new GameWindow();

        JFrame frame = new JFrame("Checkers");
        frame.setResizable(false);
        frame.setContentPane(window.getGui());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();

        frame.setVisible(true);
    }
}

此外,在设置的背景之前JButton,最好先调用button.setOpaque(true)property。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章