摘要:Swing介绍: 使用Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100% Java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色,实现了真正的一次编写处处运行。 除此之外,Swing提供了比AWT更多的图形界面组件
阅读全文
摘要:实现步骤: 读取图像Image src = ImageIO.read 创建目标图像BufferedImage distImage = new BufferedImage(dstWidth, dstHeight, BufferedImage.TYPE_INT_RGB);//目标图像画笔画图,把原图像画
阅读全文
摘要:具体编程来处理位图 知识点: 实现逻辑: 画板上的图片 new BufferedImage(canvasWidth,canvasHeight,BufferedImage.TYPE_INT_BGR); 画板Canvas的paint方法用画笔Graphics g 使用方法drawImage更新图片。 使
阅读全文
摘要:画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图。 Graphics常用的画图方法如下: drawLine(): 绘制直线 drawString(): 绘制字符串 drawRect(): 绘制矩形 drawRou
阅读全文
摘要:AWT 中的菜单由如下几个类组合而成 MenuBar: 菜单条,菜单的容器。 Menu: 菜单组件,菜单项的容器,它也是Menultem的子类,所以可作为菜单项使用。 PopupMenu: 上下文菜单组件(右键菜单组件)。 MenuItem: 菜单项组件。 CheckboxMenuItem: 复选框
阅读全文
摘要:事件处理设计到了三个对象: EventSource(事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口,菜单等。 Event (事件封装了GUI组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获得GUI组件上所发生事件的相关信息,都通过Event象来取得。 EventListene
阅读全文
摘要:对话框 Dialog是Window类的子类,是1个容器类,属于特殊组件,对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样。但对话框有如下两点需要注意。 (1),对话框通常依赖于其他窗口,就是通常有parent窗口。 (2),对话框有非模式(non-model)和模式(modal)
阅读全文
摘要:基本组件 Button: 按钮,可接受单击操作 Canvas: 用于绘图的画布 Checkbox: 复选框组(也可变成单选框组件) CheckboxGroup: 用于将多个checkbox组件组合成一组,一组Checkbox组件将只有 一个可以被选中,全部变成单选框组件 Choice: 下拉式选择框
阅读全文
摘要:1、FlowLayout流式布局管理器: FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列 。在默认情况下,FlowLayout局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。 import java.awt.*; import
阅读全文
摘要:老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称AWT。它为Java应用程序提供基本的图形组件。AWT是窗口框架,它从不同平台的窗口系统中抽取出共同组件
阅读全文
摘要:1,什么是发布订阅模式? 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如
阅读全文
摘要:问题:ArrayList 等线程不安全 当多线程并发修改一个集合数据时,可能同一个下标位置被覆盖。 示例代码: 一个List,我们创建10个线程,每个线程往这个List中添加1000条数据,结果往往不是预期的10000个大小: import java.util.ArrayList; import j
阅读全文
摘要:1,给定并行级别: 1,ExecutorService newWorkStealingPool(int parallelism): 创建持有足够的线程的线程池来支持给定的并行级别,该方法还会使用多个队列来减少竞争 2,ExecutorService newWorkStealingPool(): 该方
阅读全文
摘要:1,为什么要使用线程池:Executors 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。 线程池在系统启动时即创建大量空闲的线程,程序将Runnable对象或Calla
阅读全文
摘要:1,线程组定义: 线程组存在的意义,首要原因是安全。java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。默认情况下,我们创建的线程都在系统线程组,不过我们可以自定义自己的线程组
阅读全文
摘要:SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: "" import java.text.DateFormat; import java.text.ParseException; import ja
阅读全文
摘要:单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需
阅读全文
摘要:定时器Timer, 定时器分类: 1,指定时间指定任务(明天早上8点准时提醒我起床),相当于linux里面的at命令 2,周期性的执行任务(每隔三分钟闹钟响一次),相当于Linux里面的cron命令 JAVA中使用定时器: 1,Timer,Timer在JAVA中相当于一个任务队列,可以指定在什么时候
阅读全文
摘要:ReentrantReadWriteLock: 类ReentrantLock具有相互互斥的排他效果,也就是说,同一时间,只有一个线程执行lock()方法后面的任务。这样做虽然可以解决问题,但是效率非常低。使用ReentrantReadWriterLock可以加快运行效率,某些不需要操作实例变量的方法
阅读全文
摘要:注意 reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的 ReentrantLock 常用方法 getHoldCount获取当前线程被锁定的次数,如果调用unlock,锁定次数会减去1: lock.getQueueLength(
阅读全文