📄 graphpanel.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 + -