八皇后动态演示问题?急啊

hhz019 2007-12-05 10:11:24
我要做一个动态演示八皇后的实验?请问怎么画棋盘啊?然后怎样在适当的位置添加图像/涂色啊?
刚学GUI,还不懂啊?谢谢大家!
...全文
243 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
quietwave 2007-12-08
  • 打赏
  • 举报
回复
上次没说清楚。
应该是
覆盖JPanel的paintComponent(Graphics g)方法
或JFrame的paint(Graphics g)方法

上面那个程序较长,主要是想设计一个通用的画板类DrawPanel 和画板监听器PaintListener
楼主着急的话只要看下面那两个文件就可以了
quietwave 2007-12-07
  • 打赏
  • 举报
回复
编写一个画板类,继承JPanel,重载paint(Graphics g)方法
在paint()方法中通过调用参数Graphics实例的方法绘图(如g.drawRectangel(x,y,width,height))
将画板类的实例添加到某个显示窗口中,显示

棋盘应该可以通过 画纵横的直线 或 将每个格子当作矩形画 来实现

下面是我编写的一个画正N边形的程序,希望能对楼主有所帮助,有什么问题还请指正


//文件: NormalPolygon.java
//一个画正N边形的程序
//练习使用如下技术
//1.PaintListener 自定义的画板类及监听器
//2.ComponentListener 组件监听器监听组件改变大小,隐藏,更改位置
//3.Polygon 类, 多边形类的用法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NormalPolygon extends JFrame implements ActionListener,PaintListener{
int number = 5;
JButton confirmButton = new JButton("绘制");
DrawPanel drawPanel = new DrawPanel();
JTextField polyNumField = new JTextField(10);
Dimension dimen = null;
int radius = 100;

public NormalPolygon(){
//建立北边的Box类
Box northBox = Box.createHorizontalBox();

//添加提示标签
northBox.add(new JLabel("多边形边数:"));
northBox.add(Box.createHorizontalStrut(10));

//添加边数输入框
northBox.add(polyNumField);
polyNumField.addActionListener(this);
northBox.add(Box.createHorizontalStrut(30));

//添加绘制按钮
northBox.add(confirmButton);
confirmButton.addActionListener(this);
northBox.add(Box.createHorizontalStrut(10));

//将Box添加至主界面
Container contentPane = getContentPane();
contentPane.add(northBox, BorderLayout.NORTH);

//添加自定义的画板类
drawPanel.setBackground(Color.black);
drawPanel.addPaintListener(this);
contentPane.add(drawPanel);

//添加组件监听器
this.addComponentListener(
new ComponentAdapter(){
public void componentResized(ComponentEvent e){
updateSize();
}
}
);

//设置主界面属性
setSize(300,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//更新多边形的尺寸
updateSize();
}

//绘制的响应事件
public void actionPerformed(ActionEvent event){
try{
int tmp = Integer.parseInt(polyNumField.getText());
if(tmp <= 2) throw new Exception();
number = tmp;
drawPanel.repaint();
}
catch(NumberFormatException e){
JOptionPane.showMessageDialog(this ,"数字格式错误!");
}
catch(Exception e){
JOptionPane.showMessageDialog(this,"多边形边数应该 大于2");
}
finally{
polyNumField.setText(String.valueOf(number));
}
}

//当主窗口大小改变时,更新多边形的尺寸
private void updateSize(){
dimen = drawPanel.getSize(null);
radius = Math.min(dimen.width , dimen.height) * 2/5;
drawPanel.repaint();
}

//绘制多边形
public void paintPerformed(Graphics g){

//设置绘图色
g.setColor(Color.red);

//赋初始角度,保证是一个正立的多边形
double pieceAngel = Math.PI * 2 /number;
double startAngel = -Math.PI / 2;
if(number % 2 == 0) startAngel += pieceAngel / 2 ;

//添加多边形的各顶点坐标
Polygon poly = new Polygon();
for(int i = 0 ; i < number;i++){
startAngel += pieceAngel;
int x = (int) (radius * Math.cos(startAngel) + dimen.width /2);
int y = (int) (radius * Math.sin(startAngel) + dimen.height /2);
poly.addPoint(x,y);
}

//绘制多边形
g.fillPolygon(poly);
}

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




/*****************************
*File name : PaintListener.java
*author : ***
*Date: 2007-11-3 20:08
********************************/

import java.awt.*;
public interface PaintListener{
public void paintPerformed(Graphics g);
}




/*****************************
*File name : DrawPanel.java
*author : ***
*Date: 2007-11-3 20:08
********************************/

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.*;

//定义一个画板类,专门用来做图
public class DrawPanel extends JPanel{
PaintListener paintListener; //画图监听器

//构造函数
public DrawPanel(){
//设置边框
BevelBorder bb = new BevelBorder(BevelBorder.LOWERED);
TitledBorder tb = new TitledBorder(bb,"画布");
this.setBorder(tb);
}

//添加画图监听器
public void addPaintListener(PaintListener pl){
paintListener = pl;
}

//绘图函数
public void paintComponent(Graphics g){
super.paintComponent(g);
if(paintListener != null) paintListener.paintPerformed(g);
}

//测试函数
public static void main(String args[]){
JFrame jf = new JFrame();
Container contentPane = jf.getContentPane();
DrawPanel testPanel = new DrawPanel();
testPanel.addPaintListener( //此处添加一个绘图监听器,显示了此类的用法
new PaintListener(){
public void paintPerformed(Graphics g){
g.drawLine(20,20,300,300);
}
}
);
contentPane.add(testPanel);
jf.setSize(500,500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
jinxfei 2007-12-06
  • 打赏
  • 举报
回复
还不如用javascript。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧