import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceContext;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.Toolkit;
public class MyGrame extends JFrame {
int x1=0 ,y1=0;
int x2,y2;
String s;
private keyAction ka;
Image act;
JTextField textField;
private Clipboard board; // 剪切板
//private DataFlavor flavor;
private JPanel panel;
private JMenuBar bar;
private JMenu file;
private JFileChooser jfc;
private JMenuItem[][] items;
private URL imageUrl;
private URL image;
JComponent jfather;
JComponent canvas;
DragAndDropDropTargetListener listener;
public MyGrame() {
canvas = new JComponent() {
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
g.drawImage(act, 0,0, act.getWidth(null), act.getHeight(null), this);
g.setColor(Color.red);
g.drawLine(x1, 0, x1, act.getHeight(null));
g.drawString((String) ("x1=") + x1, x1, y1);
g.drawLine(x2, 0, x2, act.getHeight(null));
g.drawString((String) ("x2=") + x2, x2, y2);
g.drawLine(0, y1, act.getWidth(null), y1);
g.drawString((String) ("y1=") + y1, x2, y1);
g.drawLine(0, y2, act.getWidth(null), y2);
g.drawString((String) ("y2=") + y2, x1, y2);
repaint();
}
};
listener=new DragAndDropDropTargetListener();
listener.mygrame=this;
DropTarget dropTarget = new DropTarget(canvas, listener);
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new JPanel();
bar = new JMenuBar();
file = new JMenu("文件");
items = new JMenuItem[3][];
imageUrl = getClass().getResource("img.PNG");
act = new ImageIcon(imageUrl).getImage();
x2=act.getWidth(null)-1;
y2=act.getHeight(null)-1;
s = "" + x1 + ',' + x2 + ',' + y1 + ',' + y2;
panel.setOpaque(true);
panel.setBackground(Color.black);
JPanel panel3 = new JPanel();
textField = new JTextField(s, 16);
textField.setFocusable(false);
panel3.add(textField);
JButton button = new JButton("复制");
button.addActionListener(new B());
button.setFocusable(false);
panel3.add(button);
setJMenuBar(bar);
panel.setLayout(new BorderLayout(0,0));
panel.add(panel3, BorderLayout.SOUTH);
canvas.setPreferredSize(new Dimension(act.getWidth(null),act.getHeight(null)));
pack();
jfather=new JComponent(){private static final long serialVersionUID = 1L;};
jfather.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));
jfather.add(canvas);
panel.add(jfather);
setContentPane(panel);
ka = new keyAction();
this.addKeyListener(ka);
ka.picture = this;
addItem();
addEventHandler();
this.setVisible(true);
}
public void addItem() {
items[0] = new JMenuItem[4];
file.add(items[0][0] = new JMenuItem("打开"));// open
file.add(items[0][1] = new JMenuItem("保存"));// save
file.add(items[0][2] = new JMenuItem("保存 到..."));// save as
file.addSeparator();
file.add(items[0][3] = new JMenuItem("关闭"));// exit
if (board != null) {
items[1][2].setEnabled(true);// paste is enable
}
bar.add(file);
}
public void addEventHandler() {
items[0][0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"jpg & PNG Images", "jpg", "png");
jfc.setFileFilter(filter);
int returnVal = jfc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
try {
act = ImageIO.read(jfc.getSelectedFile());
x2=act.getWidth(null)-1;
y2=act.getHeight(null)-1;
setSize(act.getWidth(null),act.getHeight(null));
jfather.setSize(act.getWidth(null),act.getHeight(null));
canvas.setPreferredSize(new Dimension(act.getWidth(null),act.getHeight(null)));
pack();
setResizable(false);
s = "" + x1 + ',' + x2 + ',' + y1 + ',' + y2;
textField.setText(s);
repaint();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
items[0][1].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
jfc.showSaveDialog(null);
}
});
items[0][2].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
jfc.showSaveDialog(null);
}
});
items[0][3].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
protected static void setClipboardText(Clipboard clip, String writeMe) {
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e1) {
e1.printStackTrace();
}
MyGrame picture = new MyGrame();
picture.pack();
picture.setResizable(false);
picture.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
picture.setVisible(true);
}
class B implements ActionListener {
public void actionPerformed(ActionEvent e) {
board = Toolkit.getDefaultToolkit().getSystemClipboard();
setClipboardText(board, s);
}
}
class keyAction implements KeyListener {
MyGrame picture;
boolean up;
boolean down;
boolean right;
boolean left;
public void keyPressed(KeyEvent e) {
int onmask = KeyEvent.SHIFT_DOWN_MASK;
if (e.getModifiersEx() == onmask && (e.getKeyCode() != 0)) {
switch (e.getKeyCode()) {
case 38:
up = true;
break;
case 40:
down = true;
break;
case 37:
right = true;
break;
case 39:
left = true;
break;
}
if (up == true) {
if(y1>0)
picture.y1 -= 1;
}
if (down == true) {
if(y1<picture.act.getHeight(null)-1)
picture.y1 += 1;
}
if (right == true) {
if(x1>0)
picture.x1 -= 1;
}
if (left == true) {
if(x1<picture.act.getWidth(null)-1)
picture.x1 += 1;
}
} else {
switch (e.getKeyCode()) {
case 38:
up = true;
break;
case 40:
down = true;
break;
case 37:
right = true;
break;
case 39:
left = true;
break;
}
if (up == true) {
if(y2>0)
picture.y2 -= 1;
}
if (down == true) {
if(y2<picture.act.getHeight(null)-1)
picture.y2 += 1;
}
if (right == true) {
if(x2>0)
picture.x2 -= 1;
}
if (left == true) {
if(x2<picture.act.getWidth(null)-1)
picture.x2 += 1;
}
}
picture.s = "" + x1 + ',' + x2 + ',' + y1 + ',' + y2;
picture.textField.setText(s);
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case 38:
up = false;
break;
case 40:
down = false;
break;
case 37:
right = false;
break;
case 39:
left = false;
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
}
}
class DragAndDropDropTargetListener implements DropTargetListener{
MyGrame mygrame;
java.util.List img;
public void dragEnter(DropTargetDragEvent e){
DataFlavor javaFileListFlavor = DataFlavor.javaFileListFlavor;
try {
img=(java.util.List) e.getTransferable().getTransferData(javaFileListFlavor);
} catch (UnsupportedFlavorException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void dragOver(DropTargetDragEvent dtde){
}
public void dropActionChanged(DropTargetDragEvent dtde){
}
public void dragExit(DropTargetEvent dte){
}
public void drop(DropTargetDropEvent e){
try {
mygrame.act =ImageIO.read((File) img.get(0));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mygrame.y2=mygrame.act.getHeight(null)-1;
mygrame.x2=mygrame.act.getWidth(null)-1;
mygrame.setSize(mygrame.act.getWidth(null),mygrame.act.getHeight(null));
mygrame.jfather.setSize(mygrame.act.getWidth(null),mygrame.act.getHeight(null));
mygrame.canvas.setPreferredSize(new Dimension(mygrame.act.getWidth(null),mygrame.act.getHeight(null)));
mygrame.pack();
mygrame.setResizable(false);
mygrame.s = "" + mygrame.x1 + ',' + mygrame.x2 + ',' + mygrame.y1 + ',' + mygrame.y2;
mygrame.textField.setText(mygrame.s);
mygrame.repaint();
}
}