做五子棋的作业 遇到了问题 这是程序的主要问题所在 全部代码太多就不贴了不会有影响 大哥们帮忙啊
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>();
}
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>();
}
解决方案 »
- 【小弟不是JAVA程序员】跪求代码来了
- 各位大侠,大家说说java如果不做web方面和j2me的开发的话还可以做什么啊?
- 求助,float数组空指针异常。
- 如何在jPanel中显示图片
- java初学者提问:关于安装jdk和cmd命令行下的javac命令
- JFrame上面的JTable更新出问题, JFrame.setContentPanel()问题
- C客户端传来的中文字节流,如何在Java服务器端转换为正常的
- 接口问题:我要扩充某个类A的功能,我直接修改类A不就可以吗,为什么一定要用接口?
- java在网络中的数据流问题?
- 讨论,如何实现表示层(P)、功能层(F)、数据层(D)的分离?
- java如何实现对特定端口的IP过滤呢?(高手进)
- java怎么监听数据库
board.removeAll();
board.repaint();
for(Chess c:chesses){
add(c);
c.setLocation(c.X+base, c.Y);
}
你的board是static的啊,你看你的test方法,board.removeAll();全部没了怎么显示呢》
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);
}
}
因为我用了个jsplitpane 棋盘在左边 当分隔条移动 所有的棋子都重新分布挤在一起 而且就只剩1/4 好象是这样的