我正在开始一个小项目来创建一个简单的跳棋游戏。但是,自从我使用java GUI工具以来已经有很长一段时间了。此时代码的目标是绘制初始板(顶部为红色,底部为黑色)。但是,当我运行代码时,我得到的只是一个空白帧。我也有点不确定我的圆形绘图代码是否会做我想要的(即在某些正方形内创建纯红色或黑色圆圈)这是代码。提前感谢您的任何帮助/建议
编辑:我应该交替绘制蓝色和灰色方块,否则这个东西可能只是一个巨大的蓝色斑点,但是我会在这一点上找到一个巨大的蓝色斑点:p
import javax.swing.*;
import java.awt.*;
public class CheckersServer
{
public static class Board
{
private JFrame frame = new JFrame();
private JPanel backBoard = new JPanel();
Board()
{
frame.setSize(905,905);
backBoard.setSize(900,900);
frame.setTitle("Checkers");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
backBoard.setVisible(true);
boardSquare bs;
String type = null;
//Filling in Red Side
for (int i = 0; i <=1; i++)
{
for(int j = 0; j < 9; j++)
{
if(j % 2 == 0)
{
type = "Red";
}
else
{
type = "Blank";
}
bs = new boardSquare(100*j,100*i,type);
backBoard.add(bs);
}
}
//Filling in empty middle
type = "Blank";
for (int i = 2; i < 7; i++)
{
for(int j = 0; j < 9; j++)
{
bs = new boardSquare(100*j,100*i,type);
backBoard.add(bs);
}
}
//Filling in Black side
for (int i = 7; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(j % 2 != 0)
{
type = "Black";
}
else
{
type = "Blank";
}
bs = new boardSquare(100*j,100*i,type);
backBoard.add(bs);
}
}
backBoard.repaint();
frame.add(backBoard);
frame.repaint();
}
private class boardSquare extends JComponent
{
private int x; //x position of the rectangle measured from top left corner
private int y; //y position of the rectangle measured from top left corner
private boolean isBlack = false;
private boolean isRed = false;
public boardSquare(int p, int q, String type)
{
x = p;
y = q;
if (type.equals("Black"))
{
isBlack = true;
isRed = false;
}
else if (type.equals("Red"))
{
isRed = true;
isBlack = false;
}
else if (type.equals("Blank"))
{
isBlack = false;
isRed = false;
}
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
Rectangle box = new Rectangle(x,y,100,100);
g2.draw(box);
g2.setPaint(Color.BLUE);
g2.fill(box);
if(isBlack)
{
g2.fillOval(x, y,100 ,100 );
g2.setColor(Color.black);
g2.drawOval(x, y, 100, 100);
}
else if(isRed)
{
g2.fillOval(x, y,100 ,100 );
g2.setColor(Color.red);
g2.drawOval(x, y, 100, 100);
}
}
}
}
public static void main(String[] args)
{
Board game = new Board();
}
}
答案 0 :(得分:3)
你有几个问题。
Java UI是基于布局的,这意味着当您将组件添加到父级时,父级的布局将确定子组件的放置位置。您没有任何代码来设置布局,因此您的应用程序使用默认值(FlowLayout是默认值,这可能适合您的情况,只要您的JFrame和子节点大小合适)。
更大的问题出在boardSquare类中。默认情况下,JPanel的维度为10x10。你没有指定大小,所以你的方块都是10x10。你需要告诉方块他们有多大。您可以在boardSquare构造函数中执行此操作:
setPreferredSize(new Dimension(100, 100));
最后,在绘图代码中,绘制正方形和圆形时,您正在进行x,y的偏移。这是从组件左上角的偏移量。您的组件(设置大小后)将为100x100像素。但是如果你的x,y大于这些值,你将在组件的边界之外绘制。相反,这些值应设置为0,0,因为这是您正在绘制的组件的左上角。
通过设置正方形的首选大小并将x,y设置为0,我能够在框架中绘制正方形,尽管它并不漂亮。在正确布局之前,您需要设置正确的布局。
答案 1 :(得分:1)
以下是一些提示:
您的BoardSquare
的尺寸为0x0。对于您希望用户可见的内容而言,尺寸不是很好。
为了帮助可视化正在发生的事情,使每个BoardSquare的大小为100x100像素,并为它们提供边框。现在,您可以看到它们在GUI中显示的位置。您的GUI代码仍然需要进行重大更改,但这至少可以让您开始看到您正在处理的内容。
public BoardSquare(int p, int q, String type)
{
this.setBorder(new LineBorder(Color.CYAN, 2));
this.setPreferredSize(new Dimension(100, 100));
// ... etc ...
BoardSquare
似乎被编码为根据窗口中绝对最左边的点的坐标绘制其内容,但是应该对它们进行编码以从{{1的最左上角 - 绘制自己的内容。本身。也就是说,组件应该只在它们自己的边界内绘制,并且它们应该使用假设0,0指定组件的顶部,左侧而不是窗口的坐标。
如果您想使用BoardSquare
s(BoardSquare
s)并将它们添加到框架中,您可能应该使用不同的布局管理器,例如GridLayout。 FlowLayout不会为您提供所需的精确定位。
答案 2 :(得分:1)
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class CheckersServer2
{
public static String type_BLANK = "BLANK";
public static String type_RED = "RED";
public static String type_BLACK = "BLACK";
public static int width = 100;
public static int height = 100;
public static class Board
{
private JFrame frame = new JFrame();
private JPanel backBoard = new JPanel();
Board()
{
int numRows = 8;
int numCols = 8;
frame.setSize(905,905);
backBoard.setSize(900,900);
frame.setTitle("Checkers");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
backBoard.setVisible(true);
String type;
for(int r=0; r<numRows; r++){
for(int c=0; c<numCols; c++){
//
type = type_BLANK;
if(c%2==0){
if(r==0 || r==2) {
type = type_RED;
}else if(r==6){
type = type_BLACK;
}
}else{
if(r==1){
type = type_RED;
} else if(r==5 || r==7) {
type = type_BLACK;
}
}
backBoard.add(new BoardSquare(r,c,type));
}
}
backBoard.repaint();
frame.add(backBoard);
frame.repaint();
}
private class BoardSquare extends JComponent
{
/**
*
*/
private static final long serialVersionUID = 1L;
private int x; //x position of the rectangle measured from top left corner
private int y; //y position of the rectangle measured from top left corner
private boolean isBlack = false;
private boolean isRed = false;
public BoardSquare(int p, int q, String type)
{
//this.setBorder(new LineBorder(Color.CYAN, 2));
this.setPreferredSize(new Dimension(width, height));
x = p;
y = q;
if (type.equals(type_BLACK))
{
isBlack = true;
isRed = false;
}
else if (type.equals(type_RED))
{
isRed = true;
isBlack = false;
}
else if (type.equals(type_BLANK))
{
isBlack = false;
isRed = false;
}
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
Rectangle box = new Rectangle(x,y,width,height);
g2.draw(box);
g2.setPaint(Color.BLUE);
g2.fill(box);
int ovalWidth = width - 15;
int ovalHeight = ovalWidth;
if(isBlack)
{
g2.setColor(Color.black);
g2.fillOval(x, y, ovalWidth, ovalHeight);
g2.drawOval(x, y, ovalWidth, ovalHeight);
}
else if(isRed)
{
g2.setColor(Color.red);
g2.fillOval(x, y, ovalWidth, ovalHeight);
g2.drawOval(x, y, ovalWidth, ovalHeight);
}
}
}
}
public static void main(String[] args)
{
Board game = new Board();
}
}