gpt4 book ai didi

Java,BorderLayout.CENTER,获取JPanel的宽高

转载 作者:搜寻专家 更新时间:2023-11-01 01:57:05 26 4
gpt4 key购买 nike

我正在使用 Swing 和 AWT(供听众使用)制作一个小程序。我在获取 JPanel(名为 Chess 的类)的大小方面遇到了问题。我的布局:

public class Main extends JFrame implements MouseListener, ActionListener{

Chess chessPanel = new Chess ();
JButton newGameButton = new JButton ("New Game");
JButton loadGameButton = new JButton ("Load Game");
JButton saveGameButton = new JButton ("Save Game");
JButton exitButton = new JButton ("Exit");

public static void main (String [] args) {
new Main();
}

Main () {
super ("Chess");
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setSize(dim);
setLocation(0,0);
setUndecorated(true);

chessPanel.addMouseListener(this);
add(chessPanel, BorderLayout.CENTER);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());


newGameButton.addActionListener(this);
loadGameButton.addActionListener(this);
saveGameButton.addActionListener(this);
exitButton.addActionListener(this);

buttonPanel.add(newGameButton);
buttonPanel.add(loadGameButton);
buttonPanel.add(saveGameButton);
buttonPanel.add(exitButton);

add(buttonPanel, BorderLayout.SOUTH);

setVisible(true);
}

// ... Code ...
}

正如您从代码中看到的那样,我在 CENTER 中有一个 JPanel,它几乎占据了整个屏幕。在底部我有另一个 JPanel (SOUTH),它有一排按钮。

我需要的是 CENTER 中的 JPanel 所占的大小。当我调用从 JPanel 继承的 getWidth()、getHeight() 或 getBounds() 方法时,由于 BorderLayout,它们都返回 0。知道如何获得真正的值(value)吗?

PS:屏幕总是占据整个屏幕,并且永远不会调整大小,如果有帮助的话。

最佳答案

您可能在渲染 JPanel 之前调用 getWidth,因此它将为 0。解决方案是在 渲染之后获取尺寸,例如在 pack() 或 setVisible(true ) 已在包含此 JPanel 的根容器上调用。

此外,我建议不要在任何事情上调用 setSize(),因为大多数标准布局管理器会观察组件的首选大小,而不是大小,并且当您调用 pack() 告诉布局管理器做他们的事情时,设置大小通常被忽略。如果位于中心的 JPanel 需要特定大小,您可能希望通过重写其 setPreferredSize 方法来设置自己的大小。然后让 JFrame 及其持有的容器在您调用 pack 时根据它们的布局管理器设置适合大小。

例如,

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

public class Main extends JFrame {

Chess chessPanel = new Chess();
JButton newGameButton = new JButton("New Game");
JButton loadGameButton = new JButton("Load Game");
JButton saveGameButton = new JButton("Save Game");
JButton exitButton = new JButton("Exit");

public static void main(String[] args) {
new Main();
}

Main() {
super("Chess");
add(chessPanel, BorderLayout.CENTER);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());

buttonPanel.add(newGameButton);
buttonPanel.add(loadGameButton);
buttonPanel.add(saveGameButton);
buttonPanel.add(exitButton);

System.out.printf("chessPanel Size before rendering: %s%n", chessPanel.getSize());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(buttonPanel, BorderLayout.SOUTH);
pack();
System.out.printf("chessPanel Size after rendering: %s%n", chessPanel.getSize());
setLocationRelativeTo(null);
setVisible(true);
}

// ... Code ...
}

@SuppressWarnings("serial")
class Chess extends JPanel {
private static final int CHESS_WIDTH = 600;
private static final int CHESS_HEIGHT = CHESS_WIDTH;
private static final int MAX_ROW = 8;
private static final int MAX_COL = 8;
private static final Color LIGHT_COLOR = new Color(240, 190, 40);
private static final Color DARK_COLOR = new Color(180, 50, 0);

@Override
public Dimension getPreferredSize() {
return new Dimension(CHESS_WIDTH, CHESS_HEIGHT);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int panelWidth = getWidth();
int panelHeight = getHeight();
int sqrWidth = panelWidth / MAX_ROW;
int sqrHeight = panelHeight / MAX_COL;
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
Color c = (row % 2 == col % 2) ? LIGHT_COLOR : DARK_COLOR;
g.setColor(c);
int x = (row * panelWidth) / MAX_ROW;
int y = (col * panelHeight) / MAX_COL;
g.fillRect(x, y, sqrWidth, sqrHeight);
}
}
}
}

关于Java,BorderLayout.CENTER,获取JPanel的宽高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6403738/

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