我这里有以前收藏的代码,两个类实现了简易的文本打印机的功能,包括预览。简单跟你说一下。

1、PrinterDemo.java主体类,也是入口类,里面有main方法可以直接在Eclipse中调试运行,他实现了从本地磁盘读取文本类文件打印以及打印预览的功能,其中File动作按钮中的PrintPreviw就是打印预览功能,你可以运行看看。

2、PrintPreview.java打印预览类,这是专门为预览打印设计的类,通过他的构造方法可以构造出一个预览类,PrinterDemo中的预览功能就是调用了这个类。

两个类的源码:

【PrinterDemo.java】的源码:

  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Container;
  4. import java.awt.Dimension;
  5. import java.awt.Event;
  6. import java.awt.Font;
  7. import java.awt.Graphics;
  8. import java.awt.Graphics2D;
  9. import java.awt.Toolkit;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.KeyEvent;
  12. import java.awt.event.WindowAdapter;
  13. import java.awt.event.WindowEvent;
  14. import java.awt.print.PageFormat;
  15. import java.awt.print.Printable;
  16. import java.awt.print.PrinterException;
  17. import java.awt.print.PrinterJob;
  18. import java.io.BufferedReader;
  19. import java.io.File;
  20. import java.io.FileReader;
  21. import java.io.IOException;
  22. import java.util.Vector;
  23.  
  24. import javax.swing.AbstractAction;
  25. import javax.swing.JComponent;
  26. import javax.swing.JFileChooser;
  27. import javax.swing.JFrame;
  28. import javax.swing.JMenu;
  29. import javax.swing.JMenuBar;
  30. import javax.swing.JScrollPane;
  31. import javax.swing.KeyStroke;
  32.  
  33. public class PrinterDemo extends JFrame{
  34. private static final long serialVersionUID = 1L;
  35. private PageFormat pageFormat;
  36. private FilePageRenderer pageRenderer;
  37. private String title;
  38. public PrinterDemo(){
  39. super();
  40. init();
  41. PrinterJob pj = PrinterJob.getPrinterJob();
  42. pageFormat = pj.defaultPage();
  43. setVisible(true);
  44. }
  45. protected void init()
  46. {
  47. setSize(350, 300);
  48. center();
  49. Container content = getContentPane();
  50. content.setLayout(new BorderLayout());
  51. JMenuBar mb = new JMenuBar();
  52. JMenu file = new JMenu("File", true);
  53. file.add(new FileOpenAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,Event.CTRL_MASK));
  54. file.add(new FilePrintPreviwAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.ALT_MASK));
  55. file.add(new FilePrintAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,Event.CTRL_MASK));
  56. file.add(new FilePageSetupAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK| Event.SHIFT_MASK));
  57. file.addSeparator();
  58. file.add(new FileQuitAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
  59. Event.CTRL_MASK));
  60. mb.add(file);
  61. JMenu page = new JMenu("Page", true);
  62. page.add(new PageNextPageAction())
  63. .setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0));
  64. page.add(new PagePreviousPageAction())
  65. .setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0));
  66. mb.add(page);
  67. setJMenuBar(mb);
  68. getContentPane().setLayout(new BorderLayout());
  69. addWindowListener(new WindowAdapter()
  70. {
  71. public void windowClosing(WindowEvent e)
  72. {
  73. System.exit(0);
  74. }
  75. });
  76. }
  77.  
  78. protected void center()
  79. {
  80. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  81. Dimension frameSize = getSize();
  82. int x = (screenSize.width - frameSize.width) / 2;
  83. int y = (screenSize.height - frameSize.height) / 2;
  84. setLocation(x, y);
  85. }
  86.  
  87. public void showTitle()
  88. {
  89. int currentPage = pageRenderer.getCurrentPage() + 1;
  90. int numPages = pageRenderer.getNumPages();
  91. setTitle(title + " - page " + currentPage + " of " + numPages);
  92. }
  93.  
  94. public class FileOpenAction extends AbstractAction
  95. {
  96. private static final long serialVersionUID = 1L;
  97.  
  98. public FileOpenAction()
  99. {
  100. super("Open...");
  101. }
  102.  
  103. public void actionPerformed(ActionEvent ae)
  104. {
  105. // Pop up a file dialog.
  106. JFileChooser fc = new JFileChooser(".");
  107. int result = fc.showOpenDialog(PrinterDemo.this);
  108. if (result != 0)
  109. {
  110. return;
  111. }
  112. java.io.File f = fc.getSelectedFile();
  113. if (f == null)
  114. {
  115. return;
  116. }
  117. // Load the specified file.
  118. try
  119. {
  120. pageRenderer = new FilePageRenderer(f, pageFormat);
  121. title = "[" + f.getName() + "]";
  122. showTitle();
  123. JScrollPane jsp = new JScrollPane(pageRenderer);
  124. getContentPane().removeAll();
  125. getContentPane().add(jsp, BorderLayout.CENTER);
  126. validate();
  127. } catch (java.io.IOException ioe)
  128. {
  129. System.out.println(ioe);
  130. }
  131. }
  132. }
  133.  
  134. public static void main(String[] args){
  135. new PrinterDemo();
  136. }
  137.  
  138. public class FilePrintPreviwAction extends AbstractAction{
  139. private static final long serialVersionUID = 1L;
  140.  
  141. public FilePrintPreviwAction(){
  142. super("PrintPreviw");
  143. }
  144.  
  145. public void actionPerformed(ActionEvent ae){
  146. new PrintPreview(pageRenderer,"PrintPreviw",pageFormat.getOrientation());
  147. }
  148. }
  149.  
  150. public class FilePrintAction extends AbstractAction{
  151. private static final long serialVersionUID = 1L;
  152.  
  153. public FilePrintAction(){
  154. super("Print");
  155. }
  156.  
  157. public void actionPerformed(ActionEvent ae){
  158. PrinterJob pj = PrinterJob.getPrinterJob();
  159. pj.setPrintable(pageRenderer, pageFormat);
  160. if (pj.printDialog()){
  161. try{
  162. pj.print();
  163. } catch (PrinterException e){
  164. System.out.println(e);
  165. }
  166. }
  167. }
  168. }
  169.  
  170. public class FilePageSetupAction extends AbstractAction {
  171. private static final long serialVersionUID = 1L;
  172.  
  173. public FilePageSetupAction(){
  174. super("Page setup...");
  175. }
  176.  
  177. public void actionPerformed(ActionEvent ae){
  178. PrinterJob pj = PrinterJob.getPrinterJob();
  179. pageFormat = pj.pageDialog(pageFormat);
  180. if (pageRenderer != null){
  181. pageRenderer.pageInit(pageFormat);
  182. showTitle();
  183. }
  184. }
  185. }
  186.  
  187. public class FileQuitAction extends AbstractAction{
  188. private static final long serialVersionUID = 1L;
  189.  
  190. public FileQuitAction(){
  191. super("Quit");
  192. }
  193.  
  194. public void actionPerformed(ActionEvent ae){
  195. System.exit(0);
  196. }
  197. }
  198.  
  199. public class PageNextPageAction extends AbstractAction{
  200. private static final long serialVersionUID = 1L;
  201.  
  202. public PageNextPageAction(){
  203. super("Next page");
  204. }
  205.  
  206. public void actionPerformed(ActionEvent ae){
  207. if (pageRenderer != null)
  208. pageRenderer.nextPage();
  209. showTitle();
  210. }
  211. }
  212.  
  213. public class PagePreviousPageAction extends AbstractAction{
  214. private static final long serialVersionUID = 1L;
  215.  
  216. public PagePreviousPageAction(){
  217. super("Previous page");
  218. }
  219.  
  220. public void actionPerformed(ActionEvent ae){
  221. if (pageRenderer != null)
  222. pageRenderer.previousPage();
  223. showTitle();
  224. }
  225. }
  226.  
  227. class FilePageRenderer extends JComponent implements Printable{
  228. private static final long serialVersionUID = 1L;
  229. private int currentPageIndex;
  230. private Vector lineVector;
  231. private Vector pageVector;
  232. private Font font;
  233. private int fontSize;
  234. private Dimension preferredSize;
  235.  
  236. public FilePageRenderer(File file, PageFormat pageFormat) throws IOException{
  237. fontSize = 12;
  238. font = new Font("Serif", Font.PLAIN, fontSize);
  239. BufferedReader in = new BufferedReader(new FileReader(file));
  240. String line;
  241. lineVector = new Vector();
  242. while ((line = in.readLine()) != null)
  243. lineVector.addElement(line);
  244. in.close();
  245. pageInit(pageFormat);
  246. }
  247.  
  248. public void pageInit(PageFormat pageFormat){
  249. currentPageIndex = 0;
  250. pageVector = new Vector();
  251. float y = fontSize;
  252. Vector page = new Vector();
  253. for (int i = 0; i < lineVector.size(); i++)
  254. {
  255. String line = (String) lineVector.elementAt(i);
  256. page.addElement(line);
  257. y += fontSize;
  258. if (y + fontSize * 2 > pageFormat.getImageableHeight())
  259. {
  260. y = 0;
  261. pageVector.addElement(page);
  262. page = new Vector();
  263. }
  264. }
  265. if (page.size() > 0)
  266. pageVector.addElement(page);
  267. preferredSize = new Dimension((int) pageFormat.getImageableWidth(),
  268. (int) pageFormat.getImageableHeight());
  269. repaint();
  270. }
  271.  
  272. public void paintComponent(Graphics g) {
  273. Graphics2D g2 = (Graphics2D) g;
  274. java.awt.geom.Rectangle2D r = new java.awt.geom.Rectangle2D.Float(0,
  275. 0,
  276. preferredSize.width,
  277. preferredSize.height);
  278. g2.setPaint(Color.white);
  279. g2.fill(r);
  280. Vector page = (Vector) pageVector.elementAt(currentPageIndex);
  281. g2.setFont(font);
  282. g2.setPaint(Color.black);
  283. float x = 0;
  284. float y = fontSize;
  285. for (int i = 0; i < page.size(); i++){
  286. String line = (String) page.elementAt(i);
  287. if (line.length() > 0)
  288. g2.drawString(line, (int) x, (int) y);
  289. y += fontSize;
  290. }
  291. }
  292.  
  293. public int print(Graphics g, PageFormat pageFormat, int pageIndex){
  294. if (pageIndex >= pageVector.size())
  295. return NO_SUCH_PAGE;
  296. int savedPage = currentPageIndex;
  297. currentPageIndex = pageIndex;
  298. Graphics2D g2 = (Graphics2D) g;
  299. g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
  300. paint(g2);
  301. currentPageIndex = savedPage;
  302. return PAGE_EXISTS;
  303. }
  304.  
  305. public Dimension getPreferredSize(){
  306. return preferredSize;
  307. }
  308.  
  309. public int getCurrentPage(){
  310. return currentPageIndex;
  311. }
  312.  
  313. public int getNumPages(){
  314. return pageVector.size();
  315. }
  316.  
  317. public void nextPage() {
  318. if (currentPageIndex < pageVector.size() - 1)
  319. currentPageIndex++;
  320. repaint();
  321. }
  322. public void previousPage(){
  323. if (currentPageIndex > 0)
  324. currentPageIndex--;
  325. repaint();
  326. }
  327. }
  328. }

【PrintPreview.java】的源码:

  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Cursor;
  5. import java.awt.Dimension;
  6. import java.awt.Graphics;
  7. import java.awt.Image;
  8. import java.awt.Insets;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.image.BufferedImage;
  12. import java.awt.print.PageFormat;
  13. import java.awt.print.Printable;
  14. import java.awt.print.PrinterException;
  15. import java.awt.print.PrinterJob;
  16.  
  17. import javax.swing.ImageIcon;
  18. import javax.swing.JButton;
  19. import javax.swing.JComboBox;
  20. import javax.swing.JFrame;
  21. import javax.swing.JPanel;
  22. import javax.swing.JScrollPane;
  23. import javax.swing.JToolBar;
  24. import javax.swing.border.MatteBorder;
  25.  
  26. public class PrintPreview extends JFrame
  27. {
  28. private static final long serialVersionUID = 1L;
  29. protected int m_wPage;
  30. protected int m_hPage;
  31. protected int m_orientation;
  32. protected Printable m_target;
  33. protected JComboBox m_cbScale;
  34. protected PreviewContainer m_preview;
  35.  
  36. public PrintPreview(Printable target)
  37. {
  38. this(target, "Print Preview ", PageFormat.PORTRAIT);
  39. }
  40.  
  41. public PrintPreview(Printable target, String title, int orientation)
  42. {
  43. super(title);
  44. setSize(600, 400);
  45. getContentPane().setLayout(new BorderLayout());
  46. m_target = target;
  47. m_orientation = orientation;
  48. JToolBar tb = new JToolBar();
  49. JButton bt = new JButton("Print ", new ImageIcon("print.gif "));
  50. ActionListener lst = new ActionListener()
  51. {
  52. public void actionPerformed(ActionEvent e)
  53. {
  54. try
  55. {
  56. PrinterJob prnJob = PrinterJob.getPrinterJob();
  57. PageFormat pageFormat = prnJob.defaultPage();
  58. pageFormat.setOrientation(m_orientation);
  59. prnJob.setPrintable(m_target, pageFormat);
  60. if (!prnJob.printDialog())
  61. return;
  62. setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
  63. prnJob.print();
  64. setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  65. dispose();
  66. } catch (PrinterException ex)
  67. {
  68. ex.printStackTrace();
  69. System.err.println("Printing error: " + ex.toString());
  70. }
  71. }
  72. };
  73. bt.addActionListener(lst);
  74. bt.setAlignmentY(0.5f);
  75. bt.setMargin(new Insets(4, 6, 4, 6));
  76. tb.add(bt);
  77. bt = new JButton("Close ");
  78. lst = new ActionListener()
  79. {
  80. public void actionPerformed(ActionEvent e)
  81. {
  82. dispose();
  83. }
  84. };
  85. bt.addActionListener(lst);
  86. bt.setAlignmentY(0.5f);
  87. bt.setMargin(new Insets(2, 6, 2, 6));
  88. tb.add(bt);
  89. String[] scales = { "10%", "25%", "50%", "100%" };
  90.  
  91. m_cbScale = new JComboBox(scales);
  92. lst = new ActionListener()
  93. {
  94. public void actionPerformed(ActionEvent e)
  95. {
  96. String str = m_cbScale.getSelectedItem().toString();
  97. if (str.endsWith("%"))
  98. str = str.substring(0, str.length() - 1);
  99. str = str.trim();
  100. int scale = 0;
  101. try
  102. {
  103. scale = Integer.parseInt(str);
  104. } catch (NumberFormatException ex)
  105. {
  106. return;
  107. }
  108. int w = (int) (m_wPage * scale / 100);
  109. int h = (int) (m_hPage * scale / 100);
  110. Component[] comps = m_preview.getComponents();
  111. for (int k = 0; k < comps.length; k++)
  112. {
  113. if (!(comps[k] instanceof PagePreview))
  114. continue;
  115. PagePreview pp = (PagePreview) comps[k];
  116. pp.setScaledSize(w, h);
  117. }
  118. m_preview.doLayout();
  119. m_preview.getParent().getParent().validate();
  120. }
  121. };
  122. m_cbScale.addActionListener(lst);
  123. m_cbScale.setMaximumSize(m_cbScale.getPreferredSize());
  124. m_cbScale.setEditable(true);
  125. tb.addSeparator();
  126. tb.add(m_cbScale);
  127. getContentPane().add(tb, BorderLayout.NORTH);
  128. m_preview = new PreviewContainer();
  129. PrinterJob prnJob = PrinterJob.getPrinterJob();
  130. PageFormat pageFormat = prnJob.defaultPage();
  131. pageFormat.setOrientation(m_orientation);
  132. if (pageFormat.getHeight() == 0 || pageFormat.getWidth() == 0)
  133. {
  134. System.err.println("Unable to determine default page size ");
  135. return;
  136. }
  137. m_wPage = (int) (pageFormat.getWidth());
  138. m_hPage = (int) (pageFormat.getHeight());
  139. int scale = 10;
  140. int w = (int) (m_wPage * scale / 100);
  141. int h = (int) (m_hPage * scale / 100);
  142. int pageIndex = 0;
  143. try
  144. {
  145. while (true)
  146. {
  147. BufferedImage img = new BufferedImage(m_wPage, m_hPage, BufferedImage.TYPE_INT_RGB);
  148. Graphics g = img.getGraphics();
  149. g.setColor(Color.white);
  150. g.fillRect(0, 0, m_wPage, m_hPage);
  151. if (target.print(g, pageFormat, pageIndex) != Printable.PAGE_EXISTS)
  152. break;
  153. PagePreview pp = new PagePreview(w, h, img);
  154. m_preview.add(pp);
  155. pageIndex++;
  156. }
  157. } catch (PrinterException e)
  158. {
  159. e.printStackTrace();
  160. System.err.println("Printing error: " + e.toString());
  161. }
  162. JScrollPane ps = new JScrollPane(m_preview);
  163. getContentPane().add(ps, BorderLayout.CENTER);
  164. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  165. setVisible(true);
  166. }
  167.  
  168. class PreviewContainer extends JPanel
  169. {
  170. private static final long serialVersionUID = 1L;
  171. protected int H_GAP = 16;
  172. protected int V_GAP = 10;
  173.  
  174. public Dimension getPreferredSize()
  175. {
  176. int n = getComponentCount();
  177. if (n == 0)
  178. return new Dimension(H_GAP, V_GAP);
  179. Component comp = getComponent(0);
  180. Dimension dc = comp.getPreferredSize();
  181. int w = dc.width;
  182. int h = dc.height;
  183. Dimension dp = getParent().getSize();
  184. int nCol = Math.max((dp.width - H_GAP) / (w + H_GAP), 1);
  185. int nRow = n / nCol;
  186. if (nRow * nCol < n)
  187. nRow++;
  188. int ww = nCol * (w + H_GAP) + H_GAP;
  189. int hh = nRow * (h + V_GAP) + V_GAP;
  190. Insets ins = getInsets();
  191. return new Dimension(ww + ins.left + ins.right, hh + ins.top + ins.bottom);
  192. }
  193.  
  194. public Dimension getMaximumSize()
  195. {
  196. return getPreferredSize();
  197. }
  198.  
  199. public Dimension getMinimumSize()
  200. {
  201. return getPreferredSize();
  202. }
  203.  
  204. public void doLayout()
  205. {
  206. Insets ins = getInsets();
  207. int x = ins.left + H_GAP;
  208. int y = ins.top + V_GAP;
  209. int n = getComponentCount();
  210. if (n == 0)
  211. return;
  212. Component comp = getComponent(0);
  213. Dimension dc = comp.getPreferredSize();
  214. int w = dc.width;
  215. int h = dc.height;
  216. Dimension dp = getParent().getSize();
  217. int nCol = Math.max((dp.width - H_GAP) / (w + H_GAP), 1);
  218. int nRow = n / nCol;
  219. if (nRow * nCol < n)
  220. nRow++;
  221. int index = 0;
  222. for (int k = 0; k < nRow; k++)
  223. {
  224. for (int m = 0; m < nCol; m++)
  225. {
  226. if (index >= n)
  227. return;
  228. comp = getComponent(index++);
  229. comp.setBounds(x, y, w, h);
  230. x += w + H_GAP;
  231. }
  232. y += h + V_GAP;
  233. x = ins.left + H_GAP;
  234. }
  235. }
  236. }
  237.  
  238. class PagePreview extends JPanel
  239. {
  240. private static final long serialVersionUID = 1L;
  241. protected int m_w;
  242. protected int m_h;
  243. protected Image m_source;
  244. protected Image m_img;
  245.  
  246. public PagePreview(int w, int h, Image source)
  247. {
  248. m_w = w;
  249. m_h = h;
  250. m_source = source;
  251. m_img = m_source.getScaledInstance(m_w, m_h, Image.SCALE_SMOOTH);
  252. m_img.flush();
  253. setBackground(Color.white);
  254. setBorder(new MatteBorder(1, 1, 2, 2, Color.black));
  255. }
  256.  
  257. public void setScaledSize(int w, int h)
  258. {
  259. m_w = w;
  260. m_h = h;
  261. m_img = m_source.getScaledInstance(m_w, m_h, Image.SCALE_SMOOTH);
  262. repaint();
  263. }
  264.  
  265. public Dimension getPreferredSize()
  266. {
  267. Insets ins = getInsets();
  268. return new Dimension(m_w + ins.left + ins.right, m_h + ins.top + ins.bottom);
  269. }
  270.  
  271. public Dimension getMaximumSize()
  272. {
  273. return getPreferredSize();
  274. }
  275.  
  276. public Dimension getMinimumSize()
  277. {
  278. return getPreferredSize();
  279. }
  280.  
  281. public void paint(Graphics g)
  282. {
  283. g.setColor(getBackground());
  284. g.fillRect(0, 0, getWidth(), getHeight());
  285. g.drawImage(m_img, 0, 0, this);
  286. paintBorder(g);
  287. }
  288. }
  289. }

JAVA实现打印机的更多相关文章

  1. Java读取打印机自定义纸张.

    打印出现截断? 对于自定义纸张打印, 一定要先在打印机配置那边添加, 不然会出现截断. 例如打印1000*500, 出来是正常的, 打印216*139, 出现了截断. 因为java默认的打印, 会从打 ...

  2. java 调用打印机 打印服务

    import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import javax ...

  3. Java调用打印机打印指定路径图片

    依赖 javax.print package com.xgt.util; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; ...

  4. java之打印机服务通俗做法

    javax.print包是API的主包,其中包含的类和接口能够让你:1)发现打印服务(Print Services)2)指定打印数据的格式 3)从一个打印服务创建打印工作(print jobs) 4) ...

  5. 关于这两天研究Java打印pdf方法的记录

    这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...

  6. Java调用PDFBox打印自定义纸张PDF

    打印对象 一份设置为A3纸张, 页面边距为(10, 10, 10, 10)mm的PDF文件. PageFormat 默认PDFPrintable无法设置页面大小. PDFPrintable print ...

  7. 关于Jvm的见解(一)

    Jvm组成结构 硬件体系(如Intel体系.spac等)——>操作系统(如Windows.Linux等)——>Java Virtual Machine  所以虚拟机与硬件系统并没有直接的交 ...

  8. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  9. Java jacob调用打印机打印word文档

    前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...

随机推荐

  1. MYSQL临时表创建索引

    DROP TEMPORARY TABLE IF EXISTS tmp_record_t2;CREATE TEMPORARY TABLE tmp_record_t2(consumption_id INT ...

  2. Router的创建者——RouteBuilder

    Router的创建者--RouteBuilder 在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddl ...

  3. 永远不要修改arguments对象

    案例复现 var obj = { plus: function(arg0, arg1) { return arg0 + arg1; } }; function callMethod(context, ...

  4. C# where用法

    where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量. 1.接口约束. 例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 ICompa ...

  5. 大圆满的精髓–肯•威尔伯(KEN WILBER)

    作者:肯·威尔伯(Ken Wilber),目前被公认为是“后人本心理学”的最重要的思想家.理论家和发言人,其影响已经跨越了心理学领域,波及哲学和神学领域.由于肯·威尔伯在意识领域的研究极富基础性和开创 ...

  6. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(五)框架及Web项目的组件化

    一.组件化印象 1.先给大家看一张截图 如果我告诉大家,这就是一个web管理系统发布后的所有内容,你们会不会觉得太简洁了,只有一个web.config.一个Global.asax文件,其它的都是dll ...

  7. 用canvas画“哆啦A梦”时钟

    前言:今天看完了Js书的canvas画布那张,好开心~又是心爱的canvas~欧耶~ 之前看到有人建议我画蓝胖子,对哦,我怎么把童年最喜欢的蓝胖子忘了,为了表达我对蓝胖子的歉意,所以今天画了会动的he ...

  8. .Net 异步方法加上“timeout”

    在本羊读大学的时候,Thread让本羊云里雾里,代码写的痛不欲生,真的是让本羊脑袋里很多“线”缠绕在一起. 之后,Task让本羊代码写的飞起,甚至有时候根本不需要Task的时候还是要写上,那样显得档次 ...

  9. Display: table-cell实现img、文字垂直居中

    在文章开头先说明一下此方法的兼容性,IE8+以及其他现代浏览器都支持此属性. 直接献上一个demo吧 <!DOCTYPE html> <html> <head> & ...

  10. OS存储器管理(一)

    存储器的层次: 分为寄存器.主存(内存)和 辅存(外存)三个层次. 主存:高速缓冲存储器.主存储器.磁盘缓冲存储器, 主存又称为可执行存储器: 辅存:固定磁盘存储器.可移动的外部存储器: 其可长期保存 ...