比如,我画了个棋盘,我需要通过鼠标点击来下棋,肯定是全部要显示出来的,但我按一般方法,并没达到我的预期效果。y该怎么做???初学。下面是我的代码:
//Chessboard 
package gobang;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics;public class Chessboard extends JFrame{
public Chessboard() {
add(new Board(), BorderLayout.CENTER);//怎么没居中啊?????????
add(new PressToCircle());
//应该不这样做的吧,加这个之后,棋盘就没了棋子也只显示点击的那个
setBackground(Color.red);//怎么没显示颜色???????????
}
public static void main(String[] args) { 
Chessboard frame = new Chessboard(); 
frame.setTitle("Chessboard"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setSize(800, 800); 
frame.setVisible(true); 
}
}class Board extends JPanel{

private int width=600, height=600;//
private int d = width / 20; public Board (){
//setBackgroud(new Color(235, 157, 80));
}

public void paint(Graphics g) {//画棋盘 Component
super.paintComponent(g);
for(int i = 0; i<=width; i+= d){
if(i==0 || i==width){
g.drawLine(i, 0, i, height);
g.drawLine(0, i, width, i);
}else{
g.drawLine(i, d, i, height-d);
g.drawLine(d, i, width-d, i);
}
}
}
}
//Chessman 
package gobang;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics;public class Chessman extends JFrame{
public Chessman() { 
this.add(new PressToCircle ()); 

}class PressToCircle  extends JPanel { 
private int x, y; //位置
final int ChessSize = 30;//棋子大小

public void paintComponent(Graphics g) {//画棋子
super.paintComponent(g); 
g.drawOval(x-ChessSize/2, y-ChessSize/2, ChessSize, ChessSize); 
}

public PressToCircle () { 
this.addMouseListener(new MouseAdapter() { 
public void mouseClicked(MouseEvent e) { 
x = e.getX(); 
y = e.getY(); 
repaint(); 

}); 


解决方案 »

  1.   

    我首先来说,我运行的效果,只看到左上角上面有个半圆的圈,没有棋盘为什么会这样呢,因为这两句 add(new Board(), BorderLayout.CENTER);//怎么没居中啊?????????
     add(new PressToCircle());PressToCircle我没具体的去看
    因为你先添加了Board  再添加的时候会将之前的面扳给覆盖因为JFrame  的布局默认的为BorderLayout
      

  2.   

    晕,都跟你说了,你想清楚你的需求撒,要么就对JFrame布局一下
    要么你就只添加一个
    你换个添加的顺序,再看运行效果,棋盘出来了吧
      

  3.   

    我的需求就是在棋盘上点击后就生成一个棋子啦,如果对JFrame布局,棋盘和棋子就分开了。
    如果换下添加顺序,就只有棋盘,不能点击生成棋子。
    你是不是没理解我的意思啊,反正就是实现下棋的过程。
      

  4.   

    如果要用画的方法的话,就在Board上直接画,用图片的话可以用JLabel,总之panel上再覆盖panel实现没试过
    背景色要显示的话在Board上设置,否则会被Board覆盖
      

  5.   

    直接在你的Chessboard的JFrame上画就成了啊,你去获得鼠标事件的坐标,画个棋子就好了啊。
      

  6.   

    Swing操作不是很清楚,只好顶一下
      

  7.   

    我前几天刚做了个  类似的程序。的确是在JPanel重写后的地方画图
    class drawPanel extends JPanel {//    @Override
    //    public void update(Graphics g) {
    //        paint(g);
    //    }
        final int NUM=19;
        @Override
        @SuppressWarnings("static-access")
        public void paint(Graphics g) {
            //System.out.println("开始重绘");
            g.setColor(Color.black);
            char a_s = 'a';//棋盘从上到下的标记
            int oneToNt=1;
            String Str= new String();//将标记转化为字符串
            for (int i = 0; i < 19; ++i) {
                g.drawString(Str.valueOf((char)(a_s+i)),16,34+20*i);//为了对应交点,标记位置进行了调整
                g.drawLine(30, 30 + 20 * i, 390, 30 + 20 * i);
            }
            for (int i = 0; i < 19; ++i) {
                if(i<9){
                g.drawString(Str.valueOf(oneToNt+i),27+20*i,24);
                }else{
                   g.drawString(Str.valueOf(oneToNt+i),24+20*i,24);
                }
                g.drawLine(30 + 20 * i, 30, 30 + 20 * i, 390);
            }
        }
    }这是我的代码  给你用吧