免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2855 | 回复: 1
打印 上一主题 下一主题

Java开发的一个简单截屏工具 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-29 09:37 |只看该作者 |倒序浏览
  1. //源代码

  2. import java.awt.*;
  3. import java.awt.datatransfer.DataFlavor;
  4. import java.awt.datatransfer.Transferable;
  5. import java.awt.datatransfer.UnsupportedFlavorException;
  6. import java.awt.event.*;
  7. import javax.swing.*;
  8. import java.io.*;
  9. import javax.imageio.*;
  10. import java.awt.image.*;
  11. /**
  12. * 截屏工具
  13. * @className CaptureScreen
  14. * @author 邵海雄
  15. * @date 2015-5-16   下午07:28:37
  16. */
  17. public class CaptureScreen extends JFrame implements ActionListener {
  18. private JButton start,cancel;
  19. private JPanel c;
  20. private BufferedImage get;
  21. private JTabbedPane jtp;//一个放置很多份图片
  22. private int index;//一个一直会递增的索引,用于标认图片
  23. private JRadioButton java,system;//JAVA界面,系统界面
  24. /** Creates a new instance of CaptureScreen */
  25. public CaptureScreen() {
  26. super("屏幕截取 QQ:809309078");
  27. try{
  28. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  29. }catch(Exception exe){
  30. exe.printStackTrace();
  31. }
  32. initWindow();
  33. initOther();
  34. }
  35. private void initOther(){
  36. jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT);
  37. }
  38. private void initWindow(){
  39. start=new JButton("开始截取");
  40. cancel=new JButton("退出");
  41. start.addActionListener(this);
  42. cancel.addActionListener(this);
  43. JPanel buttonJP=new JPanel();
  44. c=new JPanel(new BorderLayout());
  45. JLabel jl=new JLabel("屏幕截取", JLabel.CENTER);
  46. JLabel jl1=new JLabel("作者: 邵海雄",JLabel.CENTER);
  47. jl.setFont(new Font("黑体",Font.BOLD,40));
  48. jl1.setFont(new Font("宋体",Font.BOLD,20));
  49. jl.setForeground(Color.RED);
  50. jl1.setForeground(Color.BLUE);
  51. c.add(jl,BorderLayout.CENTER);
  52. c.add(jl1,BorderLayout.SOUTH);
  53. buttonJP.add(start);
  54. buttonJP.add(cancel);
  55. buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区"));
  56. JPanel jp=new JPanel();//放置两个单选按钮的面板
  57. jp.add(java=new JRadioButton("java界面"));
  58. jp.add(system=new JRadioButton("系统界面",true));
  59. java.addActionListener(this);
  60. system.addActionListener(this);
  61. jp.setBorder(BorderFactory.createTitledBorder("界面风格"));
  62. ButtonGroup bg=new ButtonGroup();
  63. bg.add(java);
  64. bg.add(system);
  65. JPanel all=new JPanel();
  66. all.add(jp);
  67. all.add(buttonJP);
  68. this.getContentPane().add(c,BorderLayout.CENTER);
  69. this.getContentPane().add(all,BorderLayout.SOUTH);
  70. this.setSize(500,400);
  71. this.setLocationRelativeTo(null);
  72. this.setVisible(true);
  73. this.setAlwaysOnTop(true);
  74. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  75. }

  76. private void updates(){
  77. this.setVisible(true);
  78. if(get!=null){
  79. //如果索引是0,则表示一张图片都没有被加入过,
  80. //则要清除当前的东西,重新把tabpane放进来
  81. if(index==0){
  82. c.removeAll();
  83. c.add(jtp,BorderLayout.CENTER);
  84. }else{//否则的话,直接对tabpane添加面板就可以了
  85. //就什么都不用做了
  86. }
  87. PicPanel pic=new PicPanel(get);
  88. jtp.addTab("图片"+(++index),pic);
  89. jtp.setSelectedComponent(pic);
  90. SwingUtilities.updateComponentTreeUI(c); // 调整LookAndFeel(javax.swing)
  91. }
  92. }

  93. private void doStart(){
  94. try{
  95. this.setVisible(false);
  96. Thread.sleep(500);//睡500毫秒是为了让主窗完全不见
  97. Robot ro=new Robot(); // (通过本地操作)控制鼠标、键盘等实际输入源(java.awt)
  98. Toolkit tk=Toolkit.getDefaultToolkit(); // AWT组件的抽象父类(java.awt)
  99. Dimension di=tk.getScreenSize();
  100. Rectangle rec=new Rectangle(0,0,di.width,di.height);
  101. BufferedImage bi=ro.createScreenCapture(rec);
  102. JFrame jf=new JFrame();
  103. Temp temp=new Temp(jf,bi,di.width,di.height); // 自定义的Temp类的对象
  104. jf.getContentPane().add(temp,BorderLayout.CENTER);
  105. jf.setUndecorated(true);
  106. jf.setSize(di);
  107. jf.setVisible(true);
  108. jf.setAlwaysOnTop(true);
  109. } catch(Exception exe){
  110. exe.printStackTrace();
  111. }
  112. }

  113. /**
  114. *公用的处理保存图片的方法
  115. */
  116. public void doSave(BufferedImage get){
  117. try{
  118. if(get==null){
  119. JOptionPane.showMessageDialog(this
  120. , "图片不能为空!!", "错误", JOptionPane.ERROR_MESSAGE);
  121. return;
  122. }
  123. JFileChooser jfc=new JFileChooser(".");
  124. jfc.addChoosableFileFilter(new GIFfilter());
  125. jfc.addChoosableFileFilter(new BMPfilter());
  126. jfc.addChoosableFileFilter(new JPGfilter());
  127. jfc.addChoosableFileFilter(new PNGfilter());
  128. int i=jfc.showSaveDialog(this);
  129. if(i==JFileChooser.APPROVE_OPTION){
  130. File file=jfc.getSelectedFile();
  131. String about="PNG";
  132. String ext=file.toString().toLowerCase();
  133. javax.swing.filechooser.FileFilter ff=jfc.getFileFilter();
  134. if(ff instanceof JPGfilter){
  135. if(!ext.endsWith(".jpg")){
  136. String ns=ext+".jpg";
  137. file=new File(ns);
  138. about="JPG";
  139. }
  140. } else if(ff instanceof PNGfilter){
  141. if(!ext.endsWith(".png")){
  142. String ns=ext+".png";
  143. file=new File(ns);
  144. about="PNG";
  145. }
  146. }else if(ff instanceof BMPfilter){
  147. if(!ext.endsWith(".bmp")){
  148. String ns=ext+".bmp";
  149. file=new File(ns);
  150. about="BMP";
  151. }
  152. }else if(ff instanceof GIFfilter){
  153. if(!ext.endsWith(".gif")){
  154. String ns=ext+".gif";
  155. file=new File(ns);
  156. about="GIF";
  157. }
  158. }
  159. if(ImageIO.write(get,about,file)){
  160. JOptionPane.showMessageDialog(this,"保存成功!");
  161. } else
  162. JOptionPane.showMessageDialog(this,"保存失败!");
  163. }
  164. } catch(Exception exe){
  165. exe.printStackTrace();
  166. }
  167. }

  168. /**
  169. *公共的处理把当前的图片加入剪帖板的方法
  170. */
  171. public void doCopy(final BufferedImage image){
  172. try{
  173. if(get==null){
  174. JOptionPane.showMessageDialog(this
  175. ,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE);
  176. return;
  177. } // java.awt.datatransfer(接口)
  178. Transferable trans = new Transferable(){ // 内部类
  179. public DataFlavor[] getTransferDataFlavors() {
  180. return new DataFlavor[] { DataFlavor.imageFlavor };
  181. }
  182. public boolean isDataFlavorSupported(DataFlavor flavor) {
  183. return DataFlavor.imageFlavor.equals(flavor);
  184. }
  185. public Object getTransferData(DataFlavor flavor)
  186. throws UnsupportedFlavorException, IOException {
  187. if(isDataFlavorSupported(flavor))
  188. return image;
  189. throw new UnsupportedFlavorException(flavor);
  190. }
  191. };

  192. Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
  193. JOptionPane.showMessageDialog(this,"已复制到系统粘帖板!!");
  194. }catch(Exception exe){
  195. exe.printStackTrace();
  196. JOptionPane.showMessageDialog(this
  197. ,"复制到系统粘帖板出错!!","错误",JOptionPane.ERROR_MESSAGE);
  198. }
  199. }

  200. //处理关闭事件
  201. private void doClose(Component c){
  202. jtp.remove(c);
  203. c=null;
  204. System.gc();
  205. }

  206. public void actionPerformed(ActionEvent ae){
  207. Object source=ae.getSource();
  208. if(source==start){
  209. doStart();
  210. } else if(source==cancel){
  211. System.exit(0);
  212. }else if(source==java){ // 金属外观
  213. try{
  214. UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  215. SwingUtilities.updateComponentTreeUI(this);
  216. }catch(Exception exe){
  217. exe.printStackTrace();
  218. }
  219. }else if(source==system){ // 本地外观
  220. try{
  221. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  222. SwingUtilities.updateComponentTreeUI(this);
  223. }catch(Exception exe){
  224. exe.printStackTrace();
  225. }
  226. }
  227. }

  228. //一个内部类,它表示一个面板,一个可以被放进tabpane的面板
  229. //也有自己的一套处理保存和复制的方法
  230. private class PicPanel extends JPanel implements ActionListener{
  231. JButton save,copy,close;//表示保存,复制,关闭的按钮
  232. BufferedImage get;//得到的图片
  233. public PicPanel(BufferedImage get){
  234. super(new BorderLayout());
  235. this.get=get;
  236. initPanel();
  237. }
  238. private void initPanel(){
  239. save=new JButton("保存(S)");
  240. copy=new JButton("复制到剪帖板(C)");
  241. close=new JButton("关闭(X)");
  242. save.setMnemonic('S');
  243. copy.setMnemonic('C');
  244. close.setMnemonic('X');
  245. JPanel buttonPanel=new JPanel();
  246. buttonPanel.add(copy);
  247. buttonPanel.add(save);
  248. buttonPanel.add(close);
  249. JLabel icon=new JLabel(new ImageIcon(get));
  250. this.add(new JScrollPane(icon),BorderLayout.CENTER);
  251. this.add(buttonPanel,BorderLayout.SOUTH);
  252. save.addActionListener(this);
  253. copy.addActionListener(this);
  254. close.addActionListener(this);
  255. }
  256. public void actionPerformed(ActionEvent e) {
  257. Object source=e.getSource();
  258. if(source==save){
  259. doSave(get);
  260. }else if(source==copy){
  261. doCopy(get);
  262. }else if(source==close){
  263. get=null;
  264. doClose(this);
  265. }
  266. }
  267. }

  268. //保存BMP格式的过滤器
  269. private class BMPfilter extends javax.swing.filechooser.FileFilter{
  270. public BMPfilter(){
  271. }
  272. public boolean accept(File file){
  273. if(file.toString().toLowerCase().endsWith(".bmp")||
  274. file.isDirectory()){
  275. return true;
  276. } else
  277. return false;
  278. }
  279. public String getDescription(){
  280. return "*.BMP(BMP图像)";
  281. }
  282. }

  283. //保存JPG格式的过滤器
  284. private class JPGfilter extends javax.swing.filechooser.FileFilter{
  285. public JPGfilter(){
  286. }
  287. public boolean accept(File file){
  288. if(file.toString().toLowerCase().endsWith(".jpg")||
  289. file.isDirectory()){
  290. return true;
  291. } else
  292. return false;
  293. }
  294. public String getDescription(){
  295. return "*.JPG(JPG图像)";
  296. }
  297. }

  298. //保存GIF格式的过滤器
  299. private class GIFfilter extends javax.swing.filechooser.FileFilter{
  300. public GIFfilter(){
  301. }
  302. public boolean accept(File file){
  303. if(file.toString().toLowerCase().endsWith(".gif")||
  304. file.isDirectory()){
  305. return true;
  306. } else
  307. return false;
  308. }
  309. public String getDescription(){
  310. return "*.GIF(GIF图像)";
  311. }
  312. }

  313. //保存PNG格式的过滤器
  314. private class PNGfilter extends javax.swing.filechooser.FileFilter{
  315. public boolean accept(File file){
  316. if(file.toString().toLowerCase().endsWith(".png")||
  317. file.isDirectory()){
  318. return true;
  319. } else
  320. return false;
  321. }
  322. public String getDescription(){
  323. return "*.PNG(PNG图像)";
  324. }
  325. }

  326. //一个临时类,用于显示当前的屏幕图像
  327. private class Temp extends JPanel implements MouseListener,MouseMotionListener{
  328. private BufferedImage bi;
  329. private int width,height;
  330. private int startX,startY,endX,endY,tempX,tempY;
  331. private JFrame jf;
  332. private Rectangle select=new Rectangle(0,0,0,0);//表示选中的区域
  333. private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情况下的鼠标状态(十字线)
  334. private States current=States.DEFAULT;// 表示当前的编辑状态
  335. private Rectangle[] rec;//表示八个编辑点的区域
  336. //下面四个常量,分别表示谁是被选中的那条线上的端点
  337. public static final int START_X=1;
  338. public static final int START_Y=2;
  339. public static final int END_X=3;
  340. public static final int END_Y=4;
  341. private int currentX,currentY;//当前被选中的X和Y,只有这两个需要改变
  342. private Point p=new Point();//当前鼠标移的地点
  343. private boolean showTip=true;//是否显示提示.如果鼠标左键一按,则提示就不再显示了

  344. public Temp(JFrame jf,BufferedImage bi,int width,int height){
  345. this.jf=jf;
  346. this.bi=bi;
  347. this.width=width;
  348. this.height=height;
  349. this.addMouseListener(this);
  350. this.addMouseMotionListener(this);
  351. initRecs();
  352. }

  353. private void initRecs(){
  354. rec=new Rectangle[8];
  355. for(int i=0;i<rec.length;i++){
  356. rec[i]=new Rectangle();
  357. }
  358. }

  359. public void paintComponent(Graphics g){
  360. g.drawImage(bi,0,0,width,height,this);
  361. g.setColor(Color.RED);
  362. g.drawLine(startX,startY,endX,startY);
  363. g.drawLine(startX,endY,endX,endY);
  364. g.drawLine(startX,startY,startX,endY);
  365. g.drawLine(endX,startY,endX,endY);
  366. int x=startX<endX?startX:endX;
  367. int y=startY<endY?startY:endY;
  368. select=new Rectangle(x,y,Math.abs(endX-startX),Math.abs(endY-startY));
  369. int x1=(startX+endX)/2;
  370. int y1=(startY+endY)/2;
  371. g.fillRect(x1-2,startY-2,5,5);
  372. g.fillRect(x1-2,endY-2,5,5);
  373. g.fillRect(startX-2,y1-2,5,5);
  374. g.fillRect(endX-2,y1-2,5,5);
  375. g.fillRect(startX-2,startY-2,5,5);
  376. g.fillRect(startX-2,endY-2,5,5);
  377. g.fillRect(endX-2,startY-2,5,5);
  378. g.fillRect(endX-2,endY-2,5,5);
  379. rec[0]=new Rectangle(x-5,y-5,10,10);
  380. rec[1]=new Rectangle(x1-5,y-5,10,10);
  381. rec[2]=new Rectangle((startX>endX?startX:endX)-5,y-5,10,10);
  382. rec[3]=new Rectangle((startX>endX?startX:endX)-5,y1-5,10,10);
  383. rec[4]=new Rectangle((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10);
  384. rec[5]=new Rectangle(x1-5,(startY>endY?startY:endY)-5,10,10);
  385. rec[6]=new Rectangle(x-5,(startY>endY?startY:endY)-5,10,10);
  386. rec[7]=new Rectangle(x-5,y1-5,10,10);
  387. if(showTip){
  388. g.setColor(Color.CYAN);
  389. g.fillRect(p.x,p.y,170,20);
  390. g.setColor(Color.RED);
  391. g.drawRect(p.x,p.y,170,20);
  392. g.setColor(Color.BLACK);
  393. g.drawString("请按住鼠标左键不放选择截图区",p.x,p.y+15);
  394. }
  395. }

  396. //根据东南西北等八个方向决定选中的要修改的X和Y的座标
  397. private void initSelect(States state){
  398. switch(state){
  399. case DEFAULT:
  400. currentX=0;
  401. currentY=0;
  402. break;
  403. case EAST:
  404. currentX=(endX>startX?END_X:START_X);
  405. currentY=0;
  406. break;
  407. case WEST:
  408. currentX=(endX>startX?START_X:END_X);
  409. currentY=0;
  410. break;
  411. case NORTH:
  412. currentX=0;
  413. currentY=(startY>endY?END_Y:START_Y);
  414. break;
  415. case SOUTH:
  416. currentX=0;
  417. currentY=(startY>endY?START_Y:END_Y);
  418. break;
  419. case NORTH_EAST:
  420. currentY=(startY>endY?END_Y:START_Y);
  421. currentX=(endX>startX?END_X:START_X);
  422. break;
  423. case NORTH_WEST:
  424. currentY=(startY>endY?END_Y:START_Y);
  425. currentX=(endX>startX?START_X:END_X);
  426. break;
  427. case SOUTH_EAST:
  428. currentY=(startY>endY?START_Y:END_Y);
  429. currentX=(endX>startX?END_X:START_X);
  430. break;
  431. case SOUTH_WEST:
  432. currentY=(startY>endY?START_Y:END_Y);
  433. currentX=(endX>startX?START_X:END_X);
  434. break;
  435. default:
  436. currentX=0;
  437. currentY=0;
  438. break;
  439. }
  440. }

  441. public void mouseMoved(MouseEvent me){
  442. doMouseMoved(me);
  443. initSelect(current); // current:当前状态(state)
  444. if(showTip){
  445. p=me.getPoint();
  446. repaint();
  447. }
  448. }

  449. //特意定义一个方法处理鼠标移动,是为了每次都能初始化一下所要选择的区域
  450. private void doMouseMoved(MouseEvent me){
  451. if(select.contains(me.getPoint())){
  452. this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
  453. current=States.MOVE;
  454. } else{
  455. States[] st=States.values();
  456. for(int i=0;i<rec.length;i++){
  457. if(rec[i].contains(me.getPoint())){
  458. current=st[i];
  459. this.setCursor(st[i].getCursor());
  460. return;
  461. }
  462. }
  463. this.setCursor(cs);
  464. current=States.DEFAULT;
  465. }
  466. }

  467. public void mouseExited(MouseEvent me){
  468. }

  469. public void mouseEntered(MouseEvent me){
  470. }

  471. public void mouseDragged(MouseEvent me){
  472. int x=me.getX();
  473. int y=me.getY();
  474. // 分别处理一系列的(光标)状态(枚举值)
  475. if(current==States.MOVE){
  476. startX+=(x-tempX);
  477. startY+=(y-tempY);
  478. endX+=(x-tempX);
  479. endY+=(y-tempY);
  480. tempX=x;
  481. tempY=y;
  482. }else if(current==States.EAST||current==States.WEST){
  483. if(currentX==START_X){
  484. startX+=(x-tempX);
  485. tempX=x;
  486. }else{
  487. endX+=(x-tempX);
  488. tempX=x;
  489. }
  490. }else if(current==States.NORTH||current==States.SOUTH){
  491. if(currentY==START_Y){
  492. startY+=(y-tempY);
  493. tempY=y;
  494. }else{
  495. endY+=(y-tempY);
  496. tempY=y;
  497. }
  498. }else if(current==States.NORTH_EAST||current==States.NORTH_EAST||
  499. current==States.SOUTH_EAST||current==States.SOUTH_WEST){
  500. if(currentY==START_Y){
  501. startY+=(y-tempY);
  502. tempY=y;
  503. }else{
  504. endY+=(y-tempY);
  505. tempY=y;
  506. }
  507. if(currentX==START_X){
  508. startX+=(x-tempX);
  509. tempX=x;
  510. }else{
  511. endX+=(x-tempX);
  512. tempX=x;
  513. }
  514. }else{
  515. startX=tempX;
  516. startY=tempY;
  517. endX=me.getX();
  518. endY=me.getY();
  519. }
  520. this.repaint();
  521. }

  522. public void mousePressed(MouseEvent me){
  523. showTip=false;
  524. tempX=me.getX();
  525. tempY=me.getY();
  526. }

  527. public void mouseReleased(MouseEvent me){
  528. if(me.isPopupTrigger()){ // 右键
  529. if(current==States.MOVE){
  530. showTip=true;
  531. p=me.getPoint();
  532. startX=0;
  533. startY=0;
  534. endX=0;
  535. endY=0;
  536. repaint();
  537. } else{ // 普通情况
  538. jf.dispose();
  539. updates();
  540. }
  541. }
  542. }

  543. public void mouseClicked(MouseEvent me){
  544. if(me.getClickCount()==2){
  545. //Rectangle rec=new Rectangle(startX,startY,Math.abs(endX-startX),Math.abs(endY-startY));
  546. Point p=me.getPoint();
  547. if(select.contains(p)){
  548. if(select.x+select.width<this.getWidth()&&select.y+select.height<this.getHeight()){
  549. get=bi.getSubimage(select.x,select.y,select.width,select.height);
  550. jf.dispose();
  551. updates();
  552. }else{
  553. int wid=select.width,het=select.height;
  554. if(select.x+select.width>=this.getWidth()){
  555. wid=this.getWidth()-select.x;
  556. }
  557. if(select.y+select.height>=this.getHeight()){
  558. het=this.getHeight()-select.y;
  559. }
  560. get=bi.getSubimage(select.x,select.y,wid,het);
  561. jf.dispose();
  562. updates();
  563. }
  564. }
  565. }
  566. }
  567. }

  568. public static void main(String args[]) {
  569. SwingUtilities.invokeLater(new Runnable(){
  570. public void run(){
  571. new CaptureScreen();
  572. }
  573. });
  574. }
  575. }

  576. //一些表示状态的枚举
  577. enum States{
  578. NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角
  579. NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)),
  580. NORTH_EAST(new Cursor(Cursor.NE_RESIZE_CURSOR)),
  581. EAST(new Cursor(Cursor.E_RESIZE_CURSOR)),
  582. SOUTH_EAST(new Cursor(Cursor.SE_RESIZE_CURSOR)),
  583. SOUTH(new Cursor(Cursor.S_RESIZE_CURSOR)),
  584. SOUTH_WEST(new Cursor(Cursor.SW_RESIZE_CURSOR)),
  585. WEST(new Cursor(Cursor.W_RESIZE_CURSOR)),
  586. MOVE(new Cursor(Cursor.MOVE_CURSOR)),
  587. DEFAULT(new Cursor(Cursor.DEFAULT_CURSOR));

  588. private Cursor cs;

  589. States(Cursor cs){
  590. this.cs=cs;
  591. }

  592. public Cursor getCursor(){
  593. return cs;
  594. }
  595. }
复制代码

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
2 [报告]
发表于 2015-05-29 10:04 |只看该作者
编译无法通过啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP