代码如下:
// App.javaimport java.awt.Color
import java.awt.Graphics
import java.awt.Rectangle
import javax.swing.JFrame
public class App extends JFrame {
public App() {
this.setTitle("Chess")
this.setSize(618, 647)
this.setLocationRelativeTo(null)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
}
@Override
public void paint(Graphics g) {
super.paint(g)
Rectangle rect = getRootPane().getBounds()
int blockWidth = rect.width / 8
int blockHeight = rect.height / 8
for (int i = 0 i < 8 i++) {
for (int j = 0 j < 8 j++) {
if (i % 2 == 0) {
g.setColor(j % 2 == 0 ? Color.RED : Color.BLACK)
} else {
g.setColor(j % 2 == 0 ? Color.BLACK : Color.RED)
}
g.fillRect(rect.x + j * blockWidth, rect.y + i * blockHeight, blockWidth, blockHeight)
}
}
}
public static void main(String[] args) {
new App().setVisible(true)
}
}
运行结果:
import javax.swing.*import javax.swing.border.*
import java.awt.*
import java.beans.*
import java.util.*
/**
* 面板上的光标改变成为手型
* @author hardneedl
*/
final class ChessPaint extends JFrame{
private static final Dimension SIZE = new Dimension(600,400)
public Dimension getMinimumSize() {return SIZE}
public Dimension getMaximumSize() {return SIZE}
public Dimension getPreferredSize() {return SIZE}
public String getTitle() {return "ChessPaint"}
/**
* 棋盘
* 实现属性变化监听
*/
private class Chessboard extends Observable implements PropertyChangeListener{
private int columns, rows, cellWidth
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this)
private Chessboard(int columns, int rows, int cellWidth) {
this.columns = columns
this.rows = rows
this.cellWidth = cellWidth
}
private int getColumns() {
return columns
}
private void setColumns(int columns) {
propertyChangeSupport.firePropertyChange("columns", this.columns, columns)
this.columns = columns
}
private int getRows() {
return rows
}
private void setRows(int rows) {
propertyChangeSupport.firePropertyChange("columns", this.rows, rows)
this.rows = rows
}
private int getCellWidth() {
return cellWidth
}
private void setCellWidth(int cellWidth) {
this.cellWidth = cellWidth
}
public void propertyChange(PropertyChangeEvent evt) {
switch (evt.getPropertyName()) {
case "columns":
case "rows":
case "cellWidth":
if (!evt.getOldValue().equals(evt.getNewValue())) {
setChanged()
notifyObservers(this)
}
break
}
}
}
/**
* 画笔
*/
private interface Brush {
void paint(Graphics g)
Component getCompoment()
}
abstract private class ChessboardBrush implements Brush, Observer {
private Chessboard chessboard
private ChessboardBrush(Chessboard chessboard) {
this.chessboard = chessboard
}
public void paint(Graphics g) {
if (chessboard == null) return
Graphics2D g2 = (Graphics2D) g.create()
//背景白色
g2.setColor(Color.WHITE)
g2.fillRect(0,0, getCompoment().getWidth(), getCompoment().getHeight())
//整体偏移坐标系
g2.translate(100,100)
g2.setColor(Color.BLACK)
//绘制行线
for (int r = 0 r <= chessboard.getRows() r ++)
g2.drawLine(0, r * chessboard.getCellWidth(), chessboard.getColumns() * chessboard.getCellWidth(), r * chessboard.getCellWidth())
//绘制竖线
for (int c = 0 c <= chessboard.getColumns() c++)
g2.drawLine(c * chessboard.getCellWidth(), 0, chessboard.getCellWidth() * c , chessboard.getRows() * chessboard.getCellWidth())
g2.dispose()
}
public void update(Observable o, Object arg) {
if (arg instanceof Chessboard)
chessboard = (Chessboard)arg
}
}
/*画布*/
private class Canvas extends JComponent{
private Brush getBrush() {
return brush
}
private void setBrush(Brush brush) {
this.brush = brush
}
private Brush brush
private Canvas() {
super()
}
protected void paintComponent(Graphics g) {
super.paintComponent(g)
if(isVisible() && brush != null)
brush.paint(g)
}
public Border getBorder() {
return BorderFactory.createLineBorder(Color.BLUE,2)
}
}
private Canvas canvas
private ChessboardBrush brush
private Chessboard chessboard
private ChessPaint() {
super()
init()
addListeners()
doLay()
}
private void init(){
chessboard = new Chessboard(19,19,30)
canvas = new Canvas()
brush = new ChessboardBrush(chessboard) {
public Component getCompoment() {
return canvas
}
}
canvas.setBrush(brush)
chessboard.addObserver(brush)
}
private void addListeners(){
}
private void doLay(){
Container container = getContentPane()
container.add(canvas, BorderLayout.CENTER)
pack()
setVisible(true)
}
public static void main(String... args) {
System.setProperty("swing.defaultlaf","com.sun.java.swing.plaf.windows.WindowsLookAndFeel")
SwingUtilities.invokeLater(ChessPaint::new)
}
}
/*首先,应用程序必须为 Canvas 类创建子类,以获得有用的功能(如创建自定义组件)。必须重写 paint 方法,以便在 canvas 上执行自定义图形。
以下是代码
*/
import java.awt.Canvas
import java.awt.Font
import javax.swing.*
public class P {
public static void main(String[] args){
JFrame jf=new JFrame()
jf.setVisible(true)
jf.setLocation(200,200)
jf.setSize(300, 300)
jf.add(new a())
}
}
class a extends Canvas{
public void paint(java.awt.Graphics g){
int j=0,i=0
while(i<6){//for循环也可以
g.drawLine(0, 20*i, 100, 20*i)//横线,y坐标不变
g.drawLine(20*i, 0, 20*i, 100)
i++
}
g.drawString("楚河汉界", 20, 130)
i=0
while(i<6){
g.drawLine(0,160+20*i, 100, 160+20*i)
g.drawLine(20*i, 160, 20*i, 260)
i++}
}
}
虽然画出来了,但我想简化两个循环,如下:
class a extends Canvas{
public void paint(java.awt.Graphics g){
int j=0,i=0
do{//用for循环也可以
if(j==0){
g.drawLine(0, 20*i, 100, 20*i)//横线
g.drawLine(20*i, 0, 20*i, 100)
}
else{
g.drawLine(0,160+20*i, 100, 160+20*i)
g.drawLine(20*i, 160, 20*i, 260)
}
if(i==5&&j==0){j=1i=-1g.drawString("楚河汉界", 20, 130)}//因为判断第一次之后,i会被加一次,而这次是没有画线的,会导致少了一条线,所以i=-1
i++
}while(i<6)
}
}