做五子棋的作业 遇到了问题 这是程序的主要问题所在 全部代码太多就不贴了不会有影响 大哥们帮忙啊
class BoardPanel extends JPanel implements ActionListener{
public BoardPanel(){
setLayout(new BorderLayout());
setOpaque(false);

board=new Board();

add(board,BorderLayout.CENTER);
}
class Board extends JPanel implements MouseListener{
public Board(){
setOpaque(false);
addMouseListener(this);
}
public void paintComponent(Graphics g){
//画棋盘
Dimension size=this.getSize();
base=(size.width-576)/2;
Graphics2D g2=(Graphics2D) g;
g2.setStroke(new BasicStroke(1.0f));
for(int i=2;i<15;i++){
g2.drawLine(36+base, 36*i, 540+base, 36*i);
g2.drawLine(36*i+base, 36, 36*i+base, 540);
}
g2.setStroke(new BasicStroke(2.0f));
g2.drawLine(36+base,36,540+base,36);
g2.drawLine(36+base,540,540+base,540);
g2.drawLine(36+base,36,36+base,540);
g2.drawLine(540+base,36,540+base,540);
//
}
public void mousePressed(MouseEvent e){ //处理点击下子的事件
if(e.getX()<base+18||e.getX()>base+559||e.getY()<19||e.getY()>558) return;
pointX=(e.getX()-base)%36;
pointY=e.getY()%36;
if(pointX<=18){
pointX=e.getX()-pointX-17;
}
else{
pointX=e.getX()-pointX+19;
}
if(pointY<=18){
pointY=e.getY()-pointY-17;
}
else{
pointY=e.getY()-pointY+19;
}
if(img==null){
img=Toolkit.getDefaultToolkit().getImage("D:\\MyWorkspaces\\MyEclipse 7.0\\Gobang\\src\\com\\gobang\\5.png");
img=img.getScaledInstance(36, 36, img.SCALE_SMOOTH);
}
chesses.add(new Chess(pointX-base,pointY));//将新下的子加入chesses
updateBoard(); //显示所有已下的子
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){} public void updateBoard(){//这里能显示所有已经下的子
removeAll();
for(Chess c:chesses){
add(c);
c.setLocation(c.X+base, c.Y);
}
}
public void test(){
board.removeAll();
board.repaint();
for(Chess c:chesses){
add(c);
c.setLocation(c.X+base, c.Y);
}
}
}
public void actionPerformed(ActionEvent e){//这里响应一个board外的按钮
board.test();//但是这里就一个子都不显示了 为什么啊??
}
class Chess extends JComponent{
public int X,Y;
public Chess(int x,int y){
setSize(36,36);
setOpaque(false);
X=x;
Y=y;
}
public void paint(Graphics g){
g.drawImage(img, 0, 0, this);
}
}
//
public static int base;
private int pointX,pointY;
private Image img=null;
public static Board board;
private static ArrayList<Chess> chesses=new ArrayList<Chess>();
}

解决方案 »

  1.   

    public void test(){
    board.removeAll();
    board.repaint();
    for(Chess c:chesses){
    add(c);
    c.setLocation(c.X+base, c.Y);

    你的board是static的啊,你看你的test方法,board.removeAll();全部没了怎么显示呢》
      

  2.   

    怎么五子棋的问题有来一遍?还没解决吗?用OO的眼光去做,能归类的东西都归到类里,这样程序就很容易懂,而且好操作。我记得在另一个帖子里和你讨论过这个问题,棋子和棋盘分别为两个类,落子的过程实际就是放一个棋子类到棋盘类上, 这样要比直接把棋子画到棋盘上容易多了。这段小程序没有判断输赢的功能。我没写注释,但也应该很容易懂, 你试试看。
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JFrame;
    import javax.swing.JPanel;public class BoardPanel extends JPanel{

    public static final int BOARD_SPACE = 40;

    public static final int BOARD_ORIGIN = 40;

    public static final int BOARD_LINES = 15;

    private boolean hand = false;

    private List<Point> points = new ArrayList<Point>(); public BoardPanel() {
    try{
    initComp();
    } catch(Exception ex) {
    ex.printStackTrace();
    }
    }

    public void initComp() throws Exception {
    this.setLayout(null);
    this.addMouseListener(new BoardPanel_mouseAdapter(this));
    }

    public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setStroke(new BasicStroke(2.0f));

    g2.drawRect(BOARD_ORIGIN, BOARD_ORIGIN, BOARD_SPACE * BOARD_LINES, BOARD_SPACE * BOARD_LINES);

    g2.setStroke(new BasicStroke(1.0f));

    int x = BOARD_ORIGIN + BOARD_SPACE, y = BOARD_ORIGIN;
    for(int i = 0; i < BOARD_LINES; i ++) {
    g2.drawLine(x, y, x, BOARD_SPACE * BOARD_LINES + BOARD_ORIGIN);
    x += BOARD_SPACE;
    }

    x = BOARD_ORIGIN;
    y = BOARD_ORIGIN + BOARD_SPACE;
    for(int i = 0; i < BOARD_LINES; i ++) {
    g2.drawLine(x, y, BOARD_SPACE * BOARD_LINES + BOARD_ORIGIN, y);
    y += BOARD_SPACE;
    }
    }

    public static void main(String args[]) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100, 100, BOARD_SPACE * BOARD_LINES + BOARD_ORIGIN * 2, 
    BOARD_SPACE * BOARD_LINES + BOARD_ORIGIN * 2);
    BoardPanel bp = new BoardPanel();
    frame.add(bp);
    frame.setVisible(true);
    }

    /** Action Handler **/
    public void dropStone_mouseClicked(MouseEvent e) {
    Point p = findClosestCoord(e.getX(), e.getY());

    if(points.contains(p)) {
    System.out.print(" 已有子,无法落子.");
    return;
    }

    points.add(p);

    int offset = (BOARD_SPACE - Stone.RADIUS)/2;
    Stone stone = new Stone(p.x - offset, p.y - offset, hand?Color.white:Color.black);
    stone.setColor(hand?Color.white:Color.black);
    stone.setBounds(0, 0, stone.getRadius(), stone.getRadius());

    this.add(stone);
    this.repaint();

    hand = !hand;
    }

    private Point findClosestCoord(int x, int y) {

    int xOffset = x/BOARD_SPACE;
    int xMod = x % BOARD_SPACE;
    int yOffset = y/BOARD_SPACE;
    int yMod = y % BOARD_SPACE;

    if(xMod > BOARD_SPACE/2) xOffset += 1;
    if(yMod > BOARD_SPACE/2) yOffset += 1;

    x = BOARD_SPACE * xOffset - 10;
    y = BOARD_SPACE * yOffset - 10;

    Point p = new Point(x, y);

    System.out.print("\nDrop at [" + x + ", " + y + "]");

    return p;
    }
    }class BoardPanel_mouseAdapter extends MouseAdapter {
    BoardPanel adaptee;
    public BoardPanel_mouseAdapter(BoardPanel adaptee) {
    this.adaptee = adaptee;
    }

    public void mouseClicked(MouseEvent e) {
    adaptee.dropStone_mouseClicked(e);
    }
    }import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;import javax.swing.JPanel;public class Stone extends JPanel{

    public static final int RADIUS = 30; private int x;

    private int y;

    private int radius = RADIUS;

    private Color color;

    public Stone() {

    }

    public Stone(int x, int y, Color color) {
    setX(x);
    setY(y);
    setColor(color);
    } public int getX() {
    return x;
    } public void setX(int x) {
    this.x = x;
    } public int getY() {
    return y;
    } public void setY(int y) {
    this.y = y;
    } public int getRadius() {
    return radius;
    } public void setRadius(int radius) {
    this.radius = radius;
    } public Color getColor() {
    return color;
    } public void setColor(Color color) {
    this.color = color;
    }

    public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.drawOval(0, 0, radius, radius);
    g2.setColor(color);
    g2.fillOval(1, 1, radius-2, radius-2);
    }
    }
      

  3.   

    我好象发现问题所在了 setLayout(null);我没用...
    因为我用了个jsplitpane 棋盘在左边 当分隔条移动 所有的棋子都重新分布挤在一起 而且就只剩1/4 好象是这样的
      

  4.   

    不急 慢慢来 问题要一个一个解决 算法的东西只是小case