JFrame窗体................................................................................................. 1java
* 方法颜色服务器
* 小节颜色多线程
* 引发注意app
1、JFrame 窗体编辑器
建立窗体
在开发Java应用程序时,一般状况下利用JFrame建立窗口。利用JFrame建立的窗口分别包含一个标题、最小化按钮、最大化按钮和关闭按钮布局
在利用JFrame建立窗口时,须要设置单击关闭按钮时执行的动做 ,设置方法为经过JFrame对象的setDefault CloseOperation(int operation)方法,该方法的入口参数能够从JFrame类的静态常量中选择,可选的静态常量(代码的下方)测试
public class Test(){ public static void main(String[] args){ JFrame frame = new JFrame(“新的窗口”); // 新建一个窗体,窗体的标题是“”中的内容, JPanel panel = new JPanel(); // Jpanel 是面板容器类,包含在swing中; JTextArea textArea = new JTextArea(); // JTextArea 文本区, JTextField文本框 panel.setLayout(new GridLayout()); // Layout是布局; GridLayout 网格型布局 textArea.setText("test"); //当TextArea里的内容过长时生成滚动条 panel.add(new JScrollPane(textArea)); frame.add(panel); //在新建的窗体中添加面板; frame.setSize(200,200); //设置窗体的尺寸 frame.setVisible(true); //注意这一步必定要最后调用,使得这个窗体可见,false是不可见;
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); //定义了点击关闭按钮的做用; } }
setDefaultCloseOperation(int operation):设置用户在此窗体上发起 "close" 时默认执行的操做。方法中的参数解释以下:this
为“0”或DO_NOTHING_ON_CLOSE:spa
(在 WindowConstants 中定义):不执行任何操做;要求程序在已注册的WindowListener 对象的 windowClosing 方法中处理该操做。线程
好比实例程序代码中更改成f.setDefaultCloseOperation(f. DO_NOTHING_ON_CLOSE);或者f.setDefaultCloseOperation(0),而后查看效果,能够发现窗口没法关闭,下面是相同测试方法,再也不解释了。
为“1”或HIDE_ON_CLOSE
调用任意已注册的 WindowListener 对象后自动隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏了。能够打开任务管理器,能够看到一个叫“java.exe”的进程(若是调试运行了多个java程序,则会看到多个“java.exe”的进程),若是此时用EditPlus测试程序,会发现当单击窗口的关闭按钮关闭窗口后,却没法再次对程序进行调试,由于程序线程没有关闭,在任务管理器中关闭java.exe(若是有多个“java.exe”的进程,则先都关闭掉,再来测试该问题)基础后,EditPlus才能够从新编译改程序。
为“2”或DISPOSE_ON_CLOSE
调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。但继续运行应用程序,释放了窗体中占用的资源。
为“3”EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。结束了应用程序。
默认状况下,该值被设置为 HIDE_ON_CLOSE。
当注释掉实例中的f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);语句时,起到的效果和f.setDefaultCloseOperation(f. HIDE_ON_CLOSE); 或者f.setDefaultCloseOperation(1);同样。
在代码中执行完textArea.append("message")后,若是你想让这个更新马上显示在界面上而不是等swing的主线程返回后刷新,咱们通常会在该语句后调用textArea.invalidate()和textArea.repaint()。
问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法能够实现这个效果,就是执行如下语句
textArea.paintImmediately(textArea.getBounds());
或
textArea.paintImmediately(textArea.getX(), textArea.getY(), textArea.getWidth(), textArea.getHeight());
这时,你会发现你刚才增长的消息已经被实时地显示出来了。
final Image img = Toolkit.getDefaultToolkit().getImage(Test.class.getResource("map.png")); JTextArea ta = new JTextArea() { //文本区; { setOpaque(false);// 设置不透明的参数,缺乏时背景图片不显示 } public void paint(Graphics g) { g.drawImage(img, 0, 0, this); super.paint(g); } }; MouseListener ml = new MouseListener() { //鼠标监听器; public void mouseClicked(MouseEvent e) { //MouseEvent 是鼠标活动类型, if (e.getClickCount() == 2) { // GetClickCount() 鼠标点击的次数统计; System.out.println("Mouse double clicked"); } } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }; ta.addMouseListener(ml); ta.setBounds(0, 0, 300, 200); ta.setEditable(false);
/*JTextArea是多行文本编辑器,JTextField是一个简单的单行文本编辑器,它们都由JTextComponent类派生,因此它们包含一些共同的方法,如设置和获取所显示的文本,指定文本是否可编辑,或者是否只读,管理文本内的光标位置以及管理文本选择等。 文本组件的模型是一个称为Document的对象,对于一个JTextArea或JTextField,要为之增长或删除文本,就会改变相应的Document。当出现某种改动时,要由文档自己(而不是可视的组件)来生成与文本相关的事件。所以,为了接收JTextArea修改的通知,就要向底层Document注册,而不是向JTextArea组件自己注册: */ JTextArea textArea = new JTextArea(); Document d = textArea.getDocument(); d.addDocumentListener(someListener); /* 一个例子以下,在任意的一个文本区中键入的内容,在三个区中都将得以体现。咱们要作的就是让全部的文本区都共享一个数据模型。 */ import java.awt.Container; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class ShareModel { public static void main(String[] args) { JFrame frame = new JFrame("ShareModel"); JTextArea areaFiftyOne = new JTextArea(); JTextArea areaFiftyTwo = new JTextArea(); areaFiftyTwo.setDocument(areaFiftyOne.getDocument()); JTextArea areaFiftyThree = new JTextArea(); areaFiftyThree.setDocument(areaFiftyOne.getDocument()); Container content = frame.getContentPane(); //得到Jframe的全部awt组件,在一个容器里;这个能够用于导入到其它的容器里,实现一个如出一辙的界面; content.setLayout(new GridLayout(3,1)); //利用刚刚得到的窗体格式建立一个网格布局; content.add(new JScrollPane(areaFiftyOne)); content.add(new JScrollPane(areaFiftyTwo)); content.add(new JScrollPane(areaFiftyThree)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,300); frame.setVisible(true); } } /* 在一个文本区中键入时,此文本区将接受键盘事件,它会调用文档中的方法来更新数据,相应的,文档会向其它文本区发送事件,通知出现了更新,从而使它们可以正确的显示文档的新数据。不过,全部这一切都无需咱们关心。要作的只是通知文本区使用同一数据。Swing会接管其他的一切。 另外须要注意的,JTextArea没有滚动功能,超出文本区域的内容没法显示出来,经过鼠标拖动也没法看到。但它实现了Swing Scrollable接口。必须把它放置在JScrollPane的内部才能实现滚动。 */
经常使用方法 protected void addImpl(Component comp, Object constraints, int index) 添加指定的子 Component。 protected JRootPane createRootPane() 由构造方法调用,以建立默认的 rootPane。 protected void frameInit() 由构造方法调用,以适当地初始化 JFrame。 AccessibleContext getAccessibleContext() 得到与此 JFrame 关联的 AccessibleContext。 Container getContentPane() 返回此窗体的 contentPane 对象 int getDefaultCloseOperation() 返回用户在此窗体上发起 "close" 时执行的操做。 Component getGlassPane() 返回此窗体的 glassPane 对象。 Graphics getGraphics() 为组件建立一个图形上下文。 JMenuBar getJMenuBar() 返回此窗体上设置的菜单栏。 JLayeredPane getLayeredPane() 返回此窗体的 layeredPane 对象。 JRootPane getRootPane() 返回此窗体的 rootPane 对象。 TransferHandler getTransferHandler() 获取 transferHandler 属性。 static boolean isDefaultLookAndFeelDecorated() 若是新建立的 JFrame 应该由当前外观为其提供 Window 装饰,则返回 true。 protected boolean isRootPaneCheckingEnabled() 返回是否将对 add 和 setLayout 的调用转发到 contentPane。 protected String paramString() 返回此 JFrame 的字符串表示形式。 protected void processWindowEvent(WindowEvent e) 处理此组件上发生的窗口事件。 void remove(Component comp) 从该容器中移除指定组件。 void repaint(long time, int x, int y, int width, int height) 在 time 毫秒内重绘此组件的指定矩形区域。 void setContentPane(Container contentPane) 设置 contentPane 属性。 void setDefaultCloseOperation(int operation) 设置用户在此窗体上发起 "close" 时默认执行的操做。 static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)
提供一个关于新建立的 JFrame 是否应该具备当前外观为其提供的 Window 装饰(如边框、关闭窗口的小部件、标题等等)的提示。 void setGlassPane(Component glassPane) 设置 glassPane 属性。 void setIconImage(Image image) 设置要做为此窗口图标显示的图像。 void setJMenuBar(JMenuBar menubar) 设置此窗体的菜单栏。 void setLayeredPane(JLayeredPane layeredPane) 设置 layeredPane 属性。 void setLayout(LayoutManager manager) 设置 LayoutManager。 protected void setRootPane(JRootPane root) 设置 rootPane 属性。 protected void setRootPaneCheckingEnabled(boolean enabled) 设置是否将对 add 和 setLayout 的调用转发到 contentPane。 voidsetTransferHandler(TransferHandler newHandler) 设置 transferHandler 属性,该属性是支持向此组件传输数据的机制。 void update(Graphics g) 只是调用 paint(g)。
2、Timer计时器
private java.util.Timer timer; timer = new Timer(true); timer.schedule( new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操做的方法} }, 0, 5*60*1000); 第一个参数是要操做的方法, 第二个参数是要设定延迟的时间, 第三个参数是周期的设定,每隔多长时间执行该操做。 使用这几行代码以后,Timer自己会每隔5分钟调用一遍 server.checkNewMail()方法,不须要本身启动线程。Timer自己也是多线程同 步的,多个线程能够共用一个Timer,不须要外部的同步代码。
timer方法 (1)Timer.schedule(TimerTask task,Date time) 安排在指定的时间执行指定的任务。 (2)Timer.schedule(TimerTask task,Date firstTime ,long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行. (3)Timer.schedule(TimerTask task,long delay) 安排在指定延迟后执行指定的任务. (4)Timer.schedule(TimerTask task,long delay,long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行. (5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 安排指定的任务在指定的时间开始进行重复的固定速率执行. (6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period) 安排指定的任务在指定的延迟后开始进行重复的固定速率执行.
ava.util这个包中能够找到Timer和TimerTask这两个类。Timer直接从Object继承,它至关于一个计时器,可以用它来指定某个时间来执行一项任务,或者每隔必定时间间隔反复执行同一个任务。建立一个Timer后,就会生成一个线程在背后运行,来控制任务的执行。而TimerTask就是用来实现某项任务的类,它实现了Runnable接口,所以至关于一个线程。 如何实现本身的任务调度? 1、继承TimerTask,注意TimerTask是实现Runnable接口的,所以只要重载run()方法便可。 2、建立Timer对象,调用schedule()方法。相关注意点分析: 1、任务调度要优先考虑实时保证 因为Java的天性,而且在开发JDK的过程当中要考虑到不一样平台,而不一样平台的线程调度机制是不一样的,所以各类平台下JVM 的线程调度机制也是不一致的。从而Timer不能保证任务在所指定的时间内执行。另外因为Time rTask是实现Runnable接口的,在TimerTask被放进线程队列睡眠一段时间(wait)以后,当到了指定的该唤起该TimerTask时,因为执行的确切时机取决于JVM的调度策略和当前还有多少线程在等待CPU处理。所以 就不能保证任务在所指定的时间内执行。一般在以下两种状况下致使任务延迟执行: (1)、有大量线程在等待执行 (2)、GC机制的影响致使延迟 这也是为何在Timer API中存在两组调度方法的缘由。即: (1)、schedule() 用固定延迟调度。使用本方法时,在任务执行中的每个延迟会传播到后续的任务的执行。 (2)、scheduleAsFixedRate() 用固定比率调度。使用本方法时,全部后续执行根据初始执行的时间进行调度,从而但愿减少延迟。 具体使用哪个方法取决于哪些参数对你的程序或系统更重要。 二、每一个Timer对象要在后台启动一个线程。这种性质在一些托管的环境下不推荐使用,好比在应用服务器中。由于这些线程不在容器的控制范围以内了。