gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:46:02 24 4
gpt4 key购买 nike

我正在创建一个国际象棋游戏,其中主面板使用 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_START, BorderLayout.LINE_START, BorderLayout.CENTERBorderLayout.LINE_ENDBorderLayout.PAGE_END 优于您使用的后者。

其次,您可以简单地覆盖 getPreferredSize()上述 JPanel 的一部分,以便它提供您认为适合您的用例的一些大小。 setPreferredSize() 的使用受到限制,因为并非所有 LayoutManager 都使用尊重它指定的维度。

因此你可以这样做:

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) 属性是明智的做法。

关于java - 如何在我的 JFrame 中调整这些面板的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com