⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphpanel.java

📁 八数码拼图程序源码,可以实现初始8个数码顺序到目标8个数码顺序的自动拼图
💻 JAVA
字号:
package com.will.eightnums;

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

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author Will Wang
 * @version 1.0
 */

public class GraphPanel
    extends JPanel {
  BorderLayout borderLayout1 = new BorderLayout();
  Code codes[][] = {
      new Code[3], new Code[3], new Code[3], };
  int scoff; //绘图比例
  Code pick;
  final Color fixedColor = Color.red;
  final Color selectColor = Color.pink;
  final Color edgeColor = Color.black;

  public GraphPanel(int i) {
    try {
      jbInit();
      this.scoff = i;
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public byte[][] getData() {
    byte data[][] = {
        new byte[3], new byte[3], new byte[3]};
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        data[i][j] = (byte) codes[i][j].num;
      }
    }
    return data;
  }

  void jbInit() throws Exception {
    this.addMouseMotionListener(new GraphPanel_this_mouseMotionAdapter(this));
    this.addMouseListener(new GraphPanel_this_mouseAdapter(this));
    this.addHierarchyBoundsListener(new GraphPanel_this_hierarchyBoundsAdapter(this));
    this.setLayout(borderLayout1);
  }

  void this_ancestorResized(HierarchyEvent e) {
    this.repaint();
  }

  public void paint(Graphics g) {
    super.paint(g);
    Dimension d = getSize();
    g.setColor(Color.BLACK);
    g.drawRect( (d.width - 120 * scoff) / 2, (d.height - 120 * scoff) / 2,
               120 * scoff, 120 * scoff);
    g.drawLine( (d.width - 120 * scoff) / 2,
               (d.height - 120 * scoff) / 2 + 40 * scoff,
               (d.width + 120 * scoff) / 2,
               (d.height - 120 * scoff) / 2 + 40 * scoff);
    g.drawLine( (d.width - 120 * scoff) / 2,
               (d.height - 120 * scoff) / 2 + 80 * scoff,
               (d.width + 120 * scoff) / 2,
               (d.height - 120 * scoff) / 2 + 80 * scoff);
    g.drawLine( (d.width - 120 * scoff) / 2 + 40 * scoff,
               (d.height - 120 * scoff) / 2,
               (d.width - 120 * scoff) / 2 + 40 * scoff,
               (d.height + 120 * scoff) / 2);
    g.drawLine( (d.width - 120 * scoff) / 2 + 80 * scoff,
               (d.height - 120 * scoff) / 2,
               (d.width - 120 * scoff) / 2 + 80 * scoff,
               (d.height + 120 * scoff) / 2);
    drawCodes(g);
  }

  public void addCodes(int[][] nums) {
    Code n;
    Dimension d = getSize();
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        codes[i][j] = new Code();
        codes[i][j].x = (d.width - 120 * scoff) / 2 +
            20 * scoff * (2 * (j + 1) - 1);
        codes[i][j].y = (d.height - 120 * scoff) / 2 +
            20 * scoff * (2 * (i + 1) - 1);
        codes[i][j].num = nums[i][j];
        codes[i][j].fixed = false;

      }
    }

  }

  public void drawCodes(Graphics g) {
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (codes[i][j].num == 0) {
          continue;
        }
        g.setColor( (codes[i][j].fixed ? fixedColor : selectColor));
        g.fillRect(codes[i][j].x - 30 * scoff / 2,
                   codes[i][j].y - 30 * scoff / 2, 30 * scoff, 30 * scoff);
        g.setColor(Color.black);
        g.drawRect(codes[i][j].x - 30 * scoff / 2,
                   codes[i][j].y - 30 * scoff / 2, 30 * scoff, 30 * scoff);
        g.setFont(new Font("", Font.PLAIN, 14 * scoff));
        g.drawString(new Integer(codes[i][j].num).toString(),
                     codes[i][j].x - 5 * scoff, codes[i][j].y + 5 * scoff);
      }
    }
  }

  public synchronized void update(Graphics g) {
    //drawNodes( g);
  }

  void this_mousePressed(MouseEvent e) {
    double bestdist = Double.MAX_VALUE;
    int x = e.getX();
    int y = e.getY();
    pick = null;
    all:
        for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        //Code n = codes[i][j];
        if (Math.abs(codes[i][j].x - x) < 15 * scoff &&
            Math.abs(codes[i][j].y - y) < 15 * scoff && (codes[i][j].num != 0)) {
          codes[i][j].fixed = true;
          pick = codes[i][j];
          break all;
        }
        else {
          codes[i][j].fixed = false;
        }
      }
    }
    if (pick != null) {
      //     pickfixed = pick.fixed;
      //  pick.fixed = true;
      pick.dx = pick.x;
      pick.dy = pick.y;
      pick.x = x;
      pick.y = y;
      repaint();
      e.consume();
    }
  }

  void this_mouseReleased(MouseEvent e) {
    //判断所选择的图片是否已经大部分落在方格内部,如果是,则与相应图片交换位置,否则该图片
    //返回原来的位置
    boolean moved = false;
    int num, x, y;
    if (pick != null) {
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
          if (pick.num != codes[i][j].num &&
              Math.abs(pick.x - codes[i][j].x) < 15 * scoff &&
              Math.abs(pick.y - codes[i][j].y) < 15 * scoff) {
            num = codes[i][j].num;
            codes[i][j].num = pick.num;
            pick.num = num;
            pick.x = pick.dx;
            pick.y = pick.dy;
            moved = true;
            break;
          }
        }
      }
      if (!moved) {
        pick.x = pick.dx;
        pick.y = pick.dy;
      }
      pick.fixed = false;
      pick = null;
      repaint();
      e.consume();
    }
  }

  void this_mouseDragged(MouseEvent e) {
    if (pick != null) {
      pick.x = e.getX();
      pick.y = e.getY();
      repaint();
      e.consume();
    }
  }
}

class GraphPanel_this_hierarchyBoundsAdapter
    extends java.awt.event.HierarchyBoundsAdapter {
  GraphPanel adaptee;

  GraphPanel_this_hierarchyBoundsAdapter(GraphPanel adaptee) {
    this.adaptee = adaptee;
  }

  public void ancestorResized(HierarchyEvent e) {
    adaptee.this_ancestorResized(e);
  }
}

class GraphPanel_this_mouseAdapter
    extends java.awt.event.MouseAdapter {
  GraphPanel adaptee;

  GraphPanel_this_mouseAdapter(GraphPanel adaptee) {
    this.adaptee = adaptee;
  }

  public void mousePressed(MouseEvent e) {
    adaptee.this_mousePressed(e);
  }

  public void mouseReleased(MouseEvent e) {
    adaptee.this_mouseReleased(e);
  }
}

class GraphPanel_this_mouseMotionAdapter
    extends java.awt.event.MouseMotionAdapter {
  GraphPanel adaptee;

  GraphPanel_this_mouseMotionAdapter(GraphPanel adaptee) {
    this.adaptee = adaptee;
  }

  public void mouseDragged(MouseEvent e) {
    adaptee.this_mouseDragged(e);
  }
}

class Code { //标示数码显示位置
  int x, y, dx, dy;
  boolean fixed; //是否被选中
  int num; //1~8,9表示空位置
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -