我是Java的新手,整个使用数组+使用类及其方法来填充和显示数组。我花了最后2-3个小时,正在研究这个并检查谷歌的各种答案,似乎没有任何帮助,我仍然卡住了。在使用数组时,我真的不知道如何使用rectangle1类中的方法。
主要课程:
public static void main(String[] args) {
GameBoard frame = new GameBoard();
}
GameBoard Class
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]);
}
}
}
}
Rectangle1类。
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);
}
}
答案 0 :(得分:1)
首先,您正在与布局管理器进行斗争,在您setBounds(x, y, w, h)
类中调用类似Rectangle
的内容将被父容器的布局管理器覆盖(在本例中为框架)
其次,你不负责绘画,这样做;
board[row][col].paint(g);
g.setColor(Color.yellow);
g.fillRect(0, 0, 195, 215);
......错了。如果它没有结束你的编程崩溃,那么你的幸运。
当我尝试找出解决方案时,您可能需要花些时间阅读
在我的咆哮中......
此; public void paint(Graphics g){ g.setColor(getBackground()); g.fillRect(0,0,getWidth() - 1,getHeight() - 1); paintChildren(克); }
不合适。你必须打电话给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
答案 1 :(得分:1)
评论:
GameBoard
扩展了JFrame
,但随后您在JFrame
构造函数中创建了一个GameBoard
实例。你应该做其中一个,但不能两个都做。
Rectangle.paint()
应该是Rectangle.paintComponent()
。现在,您只需创建Rectangle对象并将其添加到容器中,例如JFrame
或JPanel
。它们将自动绘制。如果您要延长paint()
,则无需明确致电paintComponent()
或JComponent
。
答案 2 :(得分:0)
您正在使用null
Graphics对象绘制窗口。而不是使用
Graphics g = null; Graphics h = null;
使用
Graphics g = getGraphics(); Graphics h = getGraphics();
很可能这会给你一个NullPointerException
不是吗?
由于您的矩形继承自JComponent
,因此您不应该自己调用paint()
方法。而是在将所有这些内容添加到框架后调用repaint()
。
答案 3 :(得分:0)
这是你的问题:
Graphics g = null;
board[row][col].paint(g);
使用null Graphics调用paint()会导致NullPointerException
public void paint(Graphics g) {
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth()-1, getHeight()-1);
paintChildren(g);
}