java五子棋点击后出现棋子的效果

先说说我现在做到的:classLeftextendsJPanel{//棋盘面板privatestaticfinallongserialVersionUID=7070725... 先说说我现在做到的:
class Left extends JPanel{ //棋盘面板
private static final long serialVersionUID = 7070725022111250357L;
public Left(){
setBounds(00,50,600,580);
setBackground(new Color(219,253,47));
}
public int cal(int a){
int i = 0, j = 0, count = 0;
for(i = a;i >= 40;i++){
i -= 40;
count++;
}
if(i <= 20)
return count;
else
return count+1;
}
public void paint(Graphics g) {
super.paint(g);
// 画棋盘线,横竖各12条线
int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
x1 = 50;
y1 = 50;
x2 = x1 + 480;
for (int i = 0; i < 13; i++) {
g.drawLine(x1, y1, x2, y1);
y1 += 40;
}
x1 = 50;
y1 = 50;
y2 = x1 + 480;
for (int j = 0; j < 13; j++) {
g.drawLine(x1, y1, x1, y2);
x1 += 40;
addMouseListener(new MouseListener(){
int x = 0, y = 0, count = 0, a = 0, b = 0,i = 0, j = 0;
Chess ch[][] = new Chess[12][12];
public void mouseClicked(MouseEvent e) {
x = 0; y = 0; a = 0; b = 0;
x = e.getX();
y = e.getY();
if(x<50||y<50||x>530||y>530)
return;
x -=50;
y -=50;
a = cal(x);
b = cal(y);
System.out.println("第"+(b+1)+"行\n"+"第"+(a+1)+"列\n");
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
}
}
}
简单的说就是在棋盘JPanel里面添加了一个鼠标监听,并且我已经确定了棋子要出现的位置,现在我的问题就是如何控制棋子出现,一长串代码就免了,给个思路或者精短的代码吧,谢谢各位大侠了!!!
展开
 我来答
dady8888
2012-03-01
知道答主
回答量:5
采纳率:0%
帮助的人:3.4万
展开全部
一部分GUI....
package chess;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class Gui {
private GobangGame game;
private JFrame win;

private Controller controller = new Controller();
private Chesslabel[][] cells = new Chesslabel[16][16];

private ImageIcon blackIco = new ImageIcon(Gui.class.getResource("../img/black.png"));
private ImageIcon whiteIco = new ImageIcon(Gui.class.getResource("../img/white.png"));

private JLabel whiteLabel;
private JLabel blackLabel;

public Gui(GobangGame game) {
this.game = game;
init();
}

private void init() {
//类 JFrame
//public JFrame(String title)创建一个新的、初始不可见的、具有指定标题的 Frame。
win = new JFrame("五子棋大战");

//public void setDefaultCloseOperation(int operation)设置用户在此窗体上发起 "close" 时默认执行的操作
//operation - 用户关闭该窗体时应该执行的操作
//DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;
win.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

//public void addWindowListener(WindowListener l)添加指定的窗口侦听器,以从此窗口接收窗口事件。如果 l 为 null,则不抛出任何异常,且不执行任何操作。
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
controller.exit();
}
});
JPanel content = createContent();
//public void setContentPane(Container contentPane)设置 contentPane 属性。此方法由构造方法调用。
//contentPane - 此窗体的 contentPane 对象
win.setContentPane(content);
}

private JPanel createContent() {
//这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列
//五个区域:北、南、东、西、中。每个区域最多只能包含一个组件,并通过相应的常量进行标识:
//NORTH、SOUTH、EAST、WEST、CENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一
JPanel p = new JPanel(new BorderLayout());
//public void add(Component comp, Object constraints)将指定的组件添加到此容器的尾部
//comp - 要添加的组件constraints - 表示此组件的布局约束的对象
p.add(BorderLayout.CENTER, createBoardPanel());
p.add(BorderLayout.EAST, createToolPanel());
return p;
}

private JPanel createToolPanel() {
JPanel p = new JPanel(new BorderLayout());
//public void setBorder(Border border)设置此组件的边框。
//Border 对象负责定义组件的 insets(直接对组件重写所有 insets 设置),并且可选地呈现这些 insets 范围内的边框装饰。要为
//swing 组件创建有装饰的和无装饰的区域(例如边距和填充),应该使用边框(而不是 insets)。在单个组件中可使用复合边框来嵌套多个边框。
//类 EmptyBorder该类提供了一个占用空间但不执行绘制的空透明边框。
//public EmptyBorder(int top, int left,int bottom,int right)
//top边框顶部inset ,left边框左部 inset ,bottom边框底部 inset,right边框右部 inset
p.setBorder(new EmptyBorder(8, 2, 8,2));
p.add(BorderLayout.NORTH, createTools());
return p;
}

private JPanel createTools() {
//public GridLayout(int rows,int cols, int hgap,int vgap)
//创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。
//rows - 该 rows 具有表示任意行数的值零
//cols - 该 cols 具有表示任意列数的值零
//hgap - 水平间距
//vgap - 垂直间距
JPanel p = new JPanel(new GridLayout(4, 1, 0, 8));
//4行一列,水平,垂直间距
p.setBorder(new TitledBorder("工具"));//加外框和标题
// whiteLabel = new JLable
//类 JLabel用于短文本字符串或图像或二者的显示区。标签不对输入事件作出反应。因此,它无法获得键盘焦点。
//但是,标签可以为具有键盘替换功能却无法显示的邻近组件方便地显示其键盘替换功能。
//JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示
//区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。
//public JLabel(String text,Icon icon,nt horizontalAlignment)创建具有指定文本、图像和水平对齐方式的 JLabel 实例。该标签在其显示区内垂直居中对齐。文本位于图像的结尾边上。
//text - 由标签显示的文本 icon - 由标签显示的图像。 horizontalAlignment - SwingConstants 中定义的以下常量之一:LEFT、CENTER、RIGHT、LEADING 或 TRAILING。
whiteLabel = new JLabel("白",whiteIco,JLabel.LEADING); //LEADING标识使用从左到右和从右到左的语言的文本开始边。由按钮和标签使用
blackLabel = new JLabel("黑",blackIco,JLabel.LEADING);
p.add(blackLabel); //黑放下面
p.add(whiteLabel);
JButton start = new JButton("开始");
start.addActionListener(new ActionListener() { //addActionListener添加指定的动作侦听器,以接收发自此按钮的动作事件。
public void actionPerformed(ActionEvent e) {
controller.start();
}
});
p.add(start);
JButton exit = new JButton("离开");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.exit();
}
});
p.add(exit);
return p;
}

private JPanel createBoardPanel(){ //棋盘界面
//GridLayout
//public GridLayout(int rows, int cols)创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。
//rows 和 cols 中的一个可以为零(但不能两者同时为零),这表示可以将任何数目的对象置于行或列中。
JPanel p =new JPanel(new GridLayout(16,16));
//public void setBackground(Color bg) 设置此组件的背景色。
p.setBackground(new Color(0xFFDF96));
p.setBorder(new EmptyBorder(8,2,8,8)); //上左底右
for (int i = 0; i < cells.length; i++) {
for (int j = 0; j < cells[i].length; j++) {
cells[i][j] = new Chesslabel(i,j);
p.add(cells[i][j]);
}
}
return p;
}
public void show() { //固定格式
win.setSize(660, 500);
win.setVisible(true);
controller.start();
}
void showGame(){
Chess[][] board = game.getBooard();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
Chess ch = board[i][j];
cells[i][j].setChess(ch);
cells[i][j].setBorder(new LineBorder(Color.LIGHT_GRAY));
if (i==controller.lastI&&j==controller.lastJ) {
cells[i][j].setBorder(new LineBorder(Color.red));//设置此组件的边框
}
}
}

int color =game.getNextColor();
switch(color){
case Chess.WHITE:
whiteLabel.setEnabled(true);
blackLabel.setEnabled(false);
break;
case Chess.BLACK:
whiteLabel.setEnabled(false);
blackLabel.setEnabled(true);
break;
}
}

class Chesslabel extends JLabel{
//类 JLabel用于短文本字符串或图像或二者的显示区。
//JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区
//内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。
Chess chess;
int i;
int j;
public Chesslabel(){
//类 LineBorder实现单色、任意厚度线边框的类。
//public LineBorder(Color color)创建具有指定颜色、厚度为 1(thickness = 1)的线边框。
setBorder(new LineBorder(Color.LIGHT_GRAY));

//public void setHorizontalAlignment(int alignment)设置标签内容沿 X 轴的对齐方式。
//alignment - SwingConstants 中定义的以下常量之一:
//LEFT、CENTER(只显示图像的标签的默认值)、RIGHT、LEADING(只显示文本的标签的默认值)或 TRAILING。
setHorizontalAlignment(JLabel.CENTER); //子落在格子中间

//public void addMouseListener(MouseListener l)添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。
//l - 鼠标侦听器 。如果侦听器 l 为 null,则不会抛出异常并且不执行动作。
//类 MouseAdapter接收鼠标事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
//鼠标事件使用户能够跟踪鼠标何时被按下、释放、单击、移动、拖动、何时进入一个组件、何时退出、何时滚动鼠标滚轮。
addMouseListener(new MouseAdapter() {
//public void mouseClicked(MouseEvent e)鼠标按键在组件上单击(按下并释放)时调用。
public void mouseClicked(MouseEvent e){
controller.addChess(i, j);
}
});
}
public Chesslabel(int i,int j){
this();
this.i=i;
this.j=j;
}
public void setChess(Chess chess){
this.chess = chess;
switch (chess.getColor()) {
case Chess.BLACK:
setIcon(blackIco);//public void setIcon(Icon defaultIcon)设置按钮的默认图标。如果没有显式地设置按下的图标,则此图标还被用作“按下”和“禁用”图标。
break;
case Chess.WHITE:
setIcon(whiteIco);
break;
default:
setIcon(null);
break;
}

}
}

class Controller {
int lastI = -1;
int lastJ = -1;

void exit() {
//类 JOptionPane,JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框。
//public static int showConfirmDialog(Component parentComponent,Object message)throws HeadlessException
//调出带有选项 Yes、No 和 Cancel 的对话框;
//parentComponent - 确定在其中显示对话框的 Frame;如果为 null 或者 parentComponent 不具有 Frame,则使用默认的 Frame
//message - 要显示的 Object
int val= JOptionPane.showConfirmDialog(win, "走阿?");
if (val==JOptionPane.YES_OPTION) {
System.exit(0);
}
}
void start(){
lastI = -1;
lastJ = -1;
game.start();
showGame();
}

void addChess(int i, int j) {
lastI = i;
lastJ = j;
String[] msg={"黑方厉害!","白方牛人!"};
int color = game.getNextColor();
try{
game.add(i, j);
showGame();
if (game.isWin(i, j)) {
JOptionPane.showMessageDialog(win, msg[color]);
}
}catch(GameOverException e){
e.printStackTrace();
JOptionPane.showMessageDialog(win, "结束了!请重新开始!");
}catch(ChessExistException e){
e.printStackTrace();
}
}
}

// private Component createBoardPanel() {
//
// return null;
// }

// class Chesslabel extends JLabel {
// Chess chess;
// int i;
// int j;
//
// public Chesslabel() {
// setBorder(new LineBorder(Color.LIGHT_GRAY));
// setHorizontalAlignment(JLabel.CENTER);
// addMouseListener(new MouseAdapter() {
// public void mouseClicked(MouseEvent e) {
// controller.addChess(i, j);
// }
// });
// }
// }

}
追问
我有点具体的问题想请教,QQ:409301013,求赐教。。
田真久
2012-03-01 · TA获得超过661个赞
知道小有建树答主
回答量:603
采纳率:100%
帮助的人:323万
展开全部
添加监听 ,既然你知道了棋子出现的位子那么你就可以再监听的里面调用绘制方法 然后在指定的位子绘制出棋子
追问
System.out.println("第"+(b+1)+"行\n"+"第"+(a+1)+"列\n");    
JLabel l=new JLabel();
Icon icon=new ImageIcon("1.gif"); //在此直接创建对象
l.setIcon(icon);
l.setBounds(10, 10, 40,40);
add(l);
这是我写得,但是不能实现。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式