gpt4 book ai didi

java - JFrame 不显示输出?

转载 作者:行者123 更新时间:2023-12-02 07:32:18 24 4
gpt4 key购买 nike

我是 Java 新手,整个过程都是使用数组+使用类及其方法来填充和显示数组。我花了过去 2-3 个小时来解决这个问题,并在谷歌上查找各种答案,但似乎没有一个有帮助,我仍然陷入困境。使用数组时,我真的不知道如何使用矩形 1 类中的方法。

主类:

public static void main(String[] args) {
GameBoard frame = new GameBoard();
}

GameBoard 类

public class GameBoard extends JFrame {

public GameBoard() {

JFrame frame = new JFrame();
frame.setBounds(0, 0, 195, 215);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Rectangle1 board[][] = new Rectangle1[3][3];
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
board[row][col] = new Rectangle1(0, 0, 195, 215);
if ((row + col) % 2 == 0) {
Graphics g = null;
board[row][col].paint(g);
g.setColor(Color.yellow);
g.fillRect(0, 0, 195, 215);
} else {
Graphics h = null;
board[row][col].paint(h);
h.setColor(Color.red);
h.fillRect(0, 0, 195, 215);
}
frame.add(board[row][col]);
}
}

}
}

矩形1类。

public class Rectangle1 extends JComponent  {

/** post: getX() == x and getY() == y
* and getWidth() == w and getHeight() == h
* and getBackground() == Color.black
*/
public Rectangle1(int x, int y, int w, int h) {
super();
setBounds(x, y, w, h);
setBackground(Color.black);
}

/** post: this method draws a filled Rectangle
* and the upper left corner is (getX(), getY())
* and the rectangle's dimensions are getWidth() and getHeight()
* and the rectangle's color is getBackground()
*/
public void paint(Graphics g) {
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth()-1, getHeight()-1);
paintChildren(g);
}

}

最佳答案

首先,您正在与布局管理器进行斗争,在 Rectangle 类中调用类似 setBounds(x, y, w, h) 的内容将被布局覆盖父容器(本例中为框架)的管理器

其次,你不负责画画,就这样做;

board[row][col].paint(g);
g.setColor(Color.yellow);
g.fillRect(0, 0, 195, 215);

...错误。如果最终没有导致您的编程崩溃,那么您很幸运。

当我尝试找出解决方案时,您可能需要花一些时间阅读

在我咆哮时......

这个; 公共(public)无效油漆(图形g){ g.setColor( getBackground() ); g.fillRect(0, 0, getWidth()-1, getHeight()-1); 油漆 child (g); }

不合适。您必须调用 super.paint(),后台发生了很多事情,您需要重写此方法而不调用它的 super

事实上,您应该尽可能避免重写 paint ,而应使用 paintComponent 来代替。

此外,Swing 中的坐标是相对于组件的。也就是说,任何组件的左上角(在组件的上下文内)始终为 0x0

这是一个工作示例

public class TestBoard {

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

public TestBoard() {

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {

new GameBoard();

}
});

}

public class GameBoard extends JFrame {

public GameBoard() {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;

Rectangle1 board[][] = new Rectangle1[3][3];
for (int row = 0; row < board.length; row++) {

gbc.gridx = 0;

for (int col = 0; col < board[row].length; col++) {
board[row][col] = new Rectangle1(195, 215);
if ((row + col) % 2 == 0) {
board[row][col].setBackground(Color.YELLOW);
} else {
board[row][col].setBackground(Color.RED);
}
frame.add(board[row][col], gbc);
gbc.gridx++;
}

gbc.gridy++;

}

frame.pack();
frame.setVisible(true);

}
}

public class Rectangle1 extends JPanel {

public Rectangle1(int w, int h) {
setPreferredSize(new Dimension(w, h));
}

}
}

由于您的要求的性质,我被迫使用 GridBagLayout,它不是最简单的布局管理器。

JComponents本质上是透明的,需要你填写它们,最好使用JPanel

关于java - JFrame 不显示输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738365/

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