我的TicTacToe游戏有问题。我制作了2个自定义组件,一个用于tictactoe板,另一个用于统计。董事会出现但统计数据仍然隐藏......为什么?
主要方法:
public Game() {
player1 = new Player("Tester1", PieceType.Cross, Color.RED);
player2 = new Player("Tester2", PieceType.Circle, Color.BLUE);
currentPlayer = random.nextInt(2);
board = new TicTacToeBoard(125, 125, 3, 3);
stats = new Stats(375, 0, 376, 125);
setTitle("Tic Tac Toe");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
setResizable(false);
setLocationRelativeTo(null);
add(board);
add(stats);
pack();
setVisible(true);
}
统计类(必要部分):
/**
* @param x
* @param y
* @param width
* @param height
*/
public Stats(int x, int y, int width, int height) {
setPreferredSize(new Dimension(width, height));
setBounds(x, y, width, height);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public void paint(Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(x, y, width - 1, height - 1);
}
该代码应绘制2个框,对吧?它只绘制了绿色的...... 最简单,完整和可验证的例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class test {
public test() {
JFrame frame = new JFrame();
frame.setTitle("Test");
frame.setPreferredSize(new Dimension(200, 300));
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.add(new a(), BorderLayout.CENTER);
frame.add(new b(), BorderLayout.PAGE_END);
frame.pack();
frame.setVisible(true);
}
class a extends JPanel {
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(0, 0, 200, 100);
}
}
class b extends JPanel {
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 100, 200, 100);
}
}
public static void main(String[] args) {
new test();
}
}
答案 0 :(得分:3)
add(board);
add(stats);
JFrame的默认布局是BorderLayout。您没有在BorderLayout中指定组件的位置,因此它默认为CENTER。但是,您只能在CENTER中拥有一个组件。
尝试:
add(board, BorderLayout.CENTER);
add(stats, BorderLayout.PAGE_END);
自定义绘制是通过覆盖paintComponent(...)方法而不是paint()方法完成的。并且您需要调用super.paintComponent(...)作为第一个语句。
进行自定义绘制时,还需要覆盖getPreferredSize()
方法,以便布局管理器可以正常工作。否则,组件的大小将为(0,0),因此无需绘制任何内容。
将此链接保存到Swing Tutorial。
您可以找到以下部分:
How to Use BorderLayout
Performing Custom Painting
本教程提供了所有Swing基础知识的工作示例。首先下载这些演示程序。