betway必威手机版 > betway必威手机版官网 > 事件监听机制,Java读书笔记10

原标题:事件监听机制,Java读书笔记10

浏览次数:128 时间:2019-10-13

是因为近来一贯在Linux下职业,前几天遇上了Swing窗口不能够最大化的标题,刚开始一贯不得其解,最后在同事Windows平台下测量试验才意识原本是本人用Linux的因由。

1. GUI编制程序引言

    在此在此以前的就学当中,大家都施用的是命令交互格局:

         例如:在DOS命令行中通过javac java命令运转程序.

    软件的并行的不二秘技:

      1. 指令交互方式  

           图书管理连串

      2. 图纸交互方式

        ava提供了标准的API用于支付图形客户分界面

          GUI--> Graphic  User   Interface

      将在了然GUI API的架构,以致GUI组件以致组件之间的关系,容器和布局管理器,颜色,字体等.

  《JAVA 2焦点本领卷Ⅰ》第七章:图形程序设计,读书笔记,第1盘部(7.1-7.5)。

我们设置Swing窗口最大化日常有二种形式

2. GUI的分类

  首要内容囊括了:Swing概述、创制框架、框架定位等为主方法列表、在面板中彰显文字消息的主意及程序、Java 2D库的根基部分介绍。

方法一:
JFrame frame =new JFrame();
frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
frame.setLocation(0,0);
frame.show();
方法二:
(JDK1.4以上)
JFrame frame =new JFrame();
frame.show();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
方法三:
JFrame frame=new JFrame();
frame.show();
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(). setFullScreenWindow(frame);

2.1. AWT     

  Java1.0版本的图形客商分界面库,设计目的是帮忙程序员编写在有着平台上都能完美表现的GUI程序。为了落到实处那些指标Java1.0提供了抽象窗口工具集(AWT),可是那些指标并未达到。AWT在全部的系统上表现都不佳。因为:最初版本的AWT是在二个月内构思,设计和落到实处的(Think in Java )。

  Abstract  Window  Toolkit   抽象窗口工具集

  Java将图形顾客分界面相关的类捆绑在了合伙,放在了二个称为抽象窗口工具集的库中.AWT适合开辟轻巧的图形客户分界面,并不合乎开拓复杂的GUI项目.

  位于: java.awt.* 中,定义了累累的组件类,开荒者可以直接成立对象加以利用

  劣势: 全体的图形分界面都依据于底层的操作系统,轻便发生于特定平台相关的故障.

  AWT调用本地系统能源生成图形化分界面, 依赖地点平台. 1.0

一.Swing概述

  在Java 1.0刚面世的时候,满含了三个用以基本GUI程序设计的类库,Sun将它叫做抽象窗口工具箱(Abstract Window Toolkit, AWT)。基本AWT库选择将管理顾客界面成分的任务委派给各样目的平台的地点GUI工具箱的艺术,由本土GUI工具箱担负客商分界面成分的开创和动作。举例,假若选用最先的AWT在Java窗口中放置几个文本框,就能够有三个底层的“对等体”文本框,用它来其实地拍卖文件输入。

  1999年,Netscape创设了一种名为IFC(Internet Foundation Class)的GUI库,它采纳了与AWT完全两样的干活办法。它将开关、菜单那样的客户界面成分绘制在空白窗口上,而对等体只要求制造和制图窗口。Sun与Netscape同盟完善了这种艺术,创立了二个名字为Swing的客户分界面库。

  未来,Swing是不对等依据GUI工具箱的科班名字,它已经是Java基础类库(Java Foundation Class, JFC)的一部分。

  Swing未有完全代表AWT,而是依照AWT架构之上。Swing仅仅提供了力量特别强硬的顾客分界面组件。特别在动用Swing编写的程序中,还供给运用基本的AWT处总管件。

  从现行反革命先河,“Swing”是指“被绘制的”非对等体客商分界面类;“AWT”是指像事件管理那样的窗口工具箱的最底层机制。

  在技师编写Swing程序时,可以为顺序钦命特别的“观感”,如“Metal”观感,它帮忙两种核心,私下认可的主旨叫“Ocean”。

  绝大大多Java客户分界面程序设计都采纳Swing,但有二个极其的不及,Eclipse集成开拓境遇使用了一种与AWT类似,且被喻为SWT的图形工具箱,它可以映射到分裂平台的本土组件上。

内部措施一和方法三多数类似,并非确实的最大化,当您用这俩方法后,最大化按键一样是能够点的,何况最大化后大概会遮住部界面。
办法二是相比标准的用法,可难题是它在Linux下不扶助,并且是多个已知的Bug(Bug ID:6365898), 官方解释是:

2.2. Swing

SUN公司对AWT实行了升迁,基于AWT,推出了一种更稳固,更通用和更加灵敏的库.称之为Swing组件库(Swing component)。

既是都是用以GUI设计的组件库,那么为了差距Swing组件类和呼应的AWT组件类,Swing组件类皆已经字母J为前缀.位于:javax.swing.* 中,提供了和AWT中一样的持有的组件类,可是类名的前方多加了三个J.

SWING能够跨平台. 1.2

大家第一学习Swing GUI组件.

二.成立框架

  在Java中,顶层窗口(未有满含在任何窗口中的窗口)被叫做框架(frame)。在AWT中有二个叫作Frame的类,用于描述顶层窗口。这些类的Swing版本名称叫JFrame,它增加于Frame类。JFrame是极个别多少个不绘制在画布上的Swing组件之一。由此,它的梳洗部件(按键、标题、Logo等)由客商的窗口系统绘制,并非由Swing绘制。

上面是贰个在显示器中显示多少个空框架的简约程序:

图片 1图片 2例7-1 SimpleFrameTest

/**
   @version 1.31 2004-05-03
   @author Cay Horstmann
*/

import javax.swing.*;

public class SimpleFrameTest
{  
   public static void main(String[] args)
   {  
      SimpleFrame frame = new SimpleFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);  
   }
}

class SimpleFrame extends JFrame
{
   public SimpleFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
   }

   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;
}

  在暗许情状下,框架的分寸为0*0像素,定义了三个子类SimpleFrame,将框架的轻重设置为300*200像素。

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);定义了客商关闭那些框架时的响应动作,对于这几个程序来说,是让程序退出。在私下认可的境况下,客商关闭窗口时只是将框架隐敝了起来,而前后相继尚未截至。

  轻巧地结构贰个框架并不自动呈现出来,框架起首是不可以知道的,为了显得框架,要求调用setVisible方法。

  然后,main方法退出,退出main并未止住程序,终止的只是主线程。近些日子来得的框架激活了顾客分界面线程,以保险程序处于激活状态。

  程序运转结果,是体现二个小窗口。

“Please note that the bug has been fixed in the JDK 7 b14 (see the Release
Fixed field above),
which means that the JDK 6 still contains this bug. And currently we don't
plan to fix it in the JDK 6.“所以要同盟只可以选拔了,Windows平台用艺术二,Liunx平台临时只好用艺术一还是措施三了,
不过能够在点子一和方法三的基本功上做些调解,比方中度上减去职分栏的惊人和幅度上减去滚动条的肥瘦,那样就多少好点了。

3. Java GUI API

GUI API满含的类分为多少个部分:组件类(component class) 容器类(container class),和协助类(helper class)

  1. 组件类是用来创制顾客图形分界面包车型大巴,举例JButton,JLabel,JTextField.
  2. 容器类是用来含有别的零件的,举例JFrame,JPanel
  3. 援助类是用来协理GUI组件的,譬如Color,Font

三.框架定位

  JFrame类自个儿只含有若干个更改框架外观的主意,但是,它经过持续从各样超类中继续了广大用以拍卖框架大小和岗位的措施。

  最要紧的有下边多少个:

    dispose方法用于关闭窗口,并回收成立窗口所运用的所有事系统财富。

    setIconImage方法用于将窗口十分的小化时的Logo设置为Image对象(Logo化)。

    setTitle方法用于转移标题栏中的文本。

    setResizable方法运用一个boolean值鲜明框架的分寸是还是不是允许客户改造。

  JFrame类 (1.7)()

  能够看出承袭关系。上边介绍种种超类中相比常用的意义:

正文来源:

3.1. 组件类

在图形顾客分界面程序中当我们想要创造按钮、复选框和滚动条等这么些足以浮今后显示屏上的靶子,该怎么制造。其实这个都属于一类叫做组件类。

AWT中的组件根类

类 Component
java.lang.Object
            java.awt.Component

 

Swing中的组件根类

javax.swing
类 JComponent
java.lang.Object
           java.awt.Component
                    java.awt.Container
                            javax.swing.JComponent

零件类的实例能够显得在荧屏上.Component类是总结容器类的装有客商分界面类的根类是java.awt中的类,对应的Swing中的是Jcomponent.驾驭了Component和JComponent都以空泛类.所以不能够选取new关键字创立对象.所以供给利用它们的切切实实的兑现类来制造对象.

在AWT中超级图形客商界面中的按键(Button)、复选框(Checkbox)和滚动条(Scrollbar)都以组件类,皆以Component类的子类.

    在Swing中的GUI组件,有料理的JButton,JCheckBox,JscrollBar

一连关系图(AWT)

 图片 3

java.awt.Component

方法

功能及说明

boolean isVisible()

检查组件是否设置为可见。组件最初是可见的,但是JFrame这样的顶层组件除外。

void setVisible(boolean b)

显示或隐藏组件

boolean isShowing()

检查该组件是否显示在屏幕中,如果是,它必须是可见的,且包含在一个正在显示的容器中

boolean isEnabled()

检查组件是否被激活。被激活的组件可以接受键盘输入。组件最初是被激活的。

void setEnabled(boolean b)

激活或禁用组件

Point getLocation()

返回该组件左上角的位置,这是相对于外围容器左上角的位置

Point getLocationOnScreen()

返回该组件左上角的位置,这个位置用屏幕坐标表示。

void setBounds(int x, int y, int width, int height)

移动并重置组件的大小。

void setLocation(int x, int y)

void setLocation(Point p)

将组件移到一个新的位置上。如果该组件不是顶层组件,x,y是容器坐标,若是顶层组件,则为屏幕坐标。

Dimension getSize()

返回该组件当前的尺寸

void setSize(int width, int height)

void setSize(Dimension d)

重置组件的大小

图片 4

3.2. 容器类

 

  容器(Container),是二个卓越的机件,该零件可以经过add()增加任何零件。

  容器类适用于盛装其余GUI组件的GUI组件.举例 Panel Frame Dialog都是AWT组件的容器类.

相应的Swing组件的容器类是JPanel JFrame JDialog

java.awt.Window

方法

说明

void toFront()

将该窗口显示在其他窗口前面

void toBack()

将该窗口移到桌面窗口栈的后面,并重新排列所有的可见窗口

3.3. GUI辅助类

用来陈述GUI组件的质量,比如图像的颜料,字体等. 注意:扶植类是在java.awt中的

java.awt.Frame

方法

说明

void setResizable(boolean b)

决定用户是否可以重置框架的大小

void setTitle(String s)

将框架标题栏中的文字设置为字符串s

void setIconImage(Image image)

框架显示图标的图像

void setUndecorated(boolean b)

为true时取消框架装饰

boolean isUndecorated()

如果框架无装饰,返回true

int getExtendedState()

void setExtendedState(int state)

获得或设置窗口状态,状态是下列值之一:

Frame.NORMAL

Frame.ICONIFIED

Frame.MAXIMIZED_HORIZ

Frame.MAXIMIZED_VERT

Frame.MAXIMIZED_BOTH

 

其他,比较常用的叁个类(不是JFrame的超类):

3.4. GUI运营规律

在JDK的bin目录中有javaw.exe .javaw.exe是java在window中特意用来实践GUI程序.

java.awt.Toolkit

方法

说明

static Toolkit getDefaultToolkit()

返回默认的工具箱

Dimension getScreenSize()

返回用户屏幕的尺寸

Image getImage(String filename)

加载文件名为filename的图像

固然未有刚强钦命框架的轻重缓急,全部的框架私下认可为0x0像素。对石钟山规应用程序来讲,应该检查顾客荧屏的分辨率,并基于其分辨率编写代码重新载入参数框架的分寸。

为了博取荧屏的高低,能够如下操作:

// get screen dimensions

      Toolkit kit = Toolkit.getDefaultToolkit();
      Dimension screenSize = kit.getScreenSize();
      int screenHeight = screenSize.height;
      int screenWidth = screenSize.width;

4. 体验GUI

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Demo {
    public static void main(String[] args) {
        // 创建JFrame
        JFrame frame = new JFrame("hello,world");
        // 设置尺寸
        frame.setSize(200, 100);
        // JFrame在屏幕居中
        frame.setLocationRelativeTo(null);
        // JFrame关闭时的操作
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 显示JFrame
        frame.setVisible(true);

    }
}

四.在面板中显示音讯

  可以将新闻字符串直接绘制在框架中,可是那并非一种名牌产品特产产品新品优品精的编制程序习贯。在日常情形下,应该在多个称为面板(panel)的组件上绘制新闻,并将以此面板增加到框架中。

  JFrame中有四层面板:根面板、层级面板、玻璃面板、内容面板(或称内容窗格)(content pane)。

  在统筹框架的时候,要使用add()方法将富有的零件增添到内容窗格中。

  面板用JPanel类达成,这种客商分界面成分有多少个很有用的性状:

    1.分包二个能够用来绘图的外表。

    2.小编也是贰个器皿。

  为了使面板尤其富有实际运用价值,应该通过持续创制四个新类,然后覆盖或加上一些方法,来博取所须要的叠合效用。

  特别是,为了能够在面板上进展绘图,要求:

         1.概念一个增加于JPanel的类;

         2.在这里个类中,覆盖paintComponnet方法。

  paintComponnet方法定义在JComponent类中,那几个类是兼具非窗口Swing组件的超类。该方法有贰个Graphics类型的参数。Graphics对象保存着用于绘制图像和文书的装置,举例,设置当前的字体或当前的水彩。在Java中,全体的绘图都不可能不通过Graphics对象,当中囊括绘制图案、图像和文件的格局。

  不管何种原因,只要窗口必要重新绘制,事件管理器就能够通报组件,进而引发执行全数组件的paintComponent方法。一定毫无自个儿调用paintComponnet方法。

  即使需求强制刷新荧屏,就必要调用repaint方法。

5. Jframe框架

JFrame(框架)是一个容器

创办贰个客户分界面须要创制一个JFrame来存放在顾客分界面组件.比如寄放按键,文本框。

javax.swing 
类 JFrame
java.lang.Object
  java.awt.Component
      java.awt.Container
          java.awt.Window
              java.awt.Frame
                  javax.swing.JFrame

 

来得文本

  突显文本是一种特殊的绘图,Graphics类中有一个drawString方法,调用格式为:

  g.drawString(text,x,y);

  完整的程序代码如下:

图片 5图片 6例7-3 NotHelloWorld

/**
   @version 1.31 2004-05-03
   @author Cay Horstmann
*/

import javax.swing.*;
import java.awt.*;

public class NotHelloWorld
{  
   public static void main(String[] args)
   {  
      NotHelloWorldFrame frame = new NotHelloWorldFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

/**
   A frame that contains a message panel
*/
class NotHelloWorldFrame extends JFrame
{
   public NotHelloWorldFrame()
   {
      setTitle("NotHelloWorld");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      // add panel to frame

      NotHelloWorldPanel panel = new NotHelloWorldPanel();
      add(panel);
   }

   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;  
}

/**
   A panel that displays a message. 
*/
class NotHelloWorldPanel extends JPanel
{  
   public void paintComponent(Graphics g)
   {  
      super.paintComponent(g);

      g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
   }

   public static final int MESSAGE_X = 75;
   public static final int MESSAGE_Y = 100;
}

  NotHelloWorldPanel类扩张了JPanel类,在填写面板的背景颜色时,JPanel类有自个儿的管理格局,为了保障超类达成本身这部分办事,必需在绘制本人的内容前面调用super.paintComponent(g);

5.1. 创办多少个框架

public class Demo1 {
    public static void main(String[] args) {
        // 创建JFrame
        JFrame frame = new JFrame("我的frame");
        // 显示JFrame
        frame.setVisible(true);

    }
}

 

留神:须求调用setVisible(true)方法后才交易会示框架

  运维程序会在窗口的左上角展现二个窗口,不过只可以呈现标题栏,何况关闭JFrame时,程序程序尚未甘休.

为此要求做到如下须要:

  1: 设置Jframe的肥瘦和中度

  2: 让Jframe展现在荧屏中间

  3: 关闭Jframe时,程序会结束

五.2D图形

  Java 2D库完结了一组效能强盛的图形操作。

  要想使用Java 2D库绘制图形,必要获得三个Graphics2D类对象。这一个类是Graphics类的子类。如若采取的是一个援救Java 2D的JDK版本,paintComponent方法就能够自动地获得三个Graphics2D类对象,只需举行一遍类型调换就能够了,如下:

   public void paintComponent(Graphics g)

   { 
      Graphics2D g2=(Graphics2D) g;
      …
   }

 

  Java 2D库采用面向对象的艺术将几何图形组织起来。包括描述直线、矩形和椭圆的类:Line2D、 Rectangle2D、 Ellipse2D,那一个类全部兑现了Shape接口。

  要想绘制图形,首先创造二个实现了Shape接口的类的靶子,然后调用Graphics2D类中的draw方法。举个例子:

Rectangle2D rect=…

g2.draw(rect);

 

5.1.1.  装置JFrame的小幅度和冲天

java.awt.Window.setSize(int width, int height)

 

搜寻API文书档案,查看 setSize方法,能够钦点框架的上升的幅度和高度.参数类型是int,注意是以像素为单位,普通的笔记本的显示屏分辨率为1280*800或者1366*768.瞩目:分辨率表示每平方英寸的像素数.显示屏分辨率越高,显示屏的像素更加多.所以分辨率越高来看的内情就越来越多.

setSize方法被定义在java.awt.Component类中,被Component  的子类java.awt.Window 重写.而Jframe以一而再了Windiws类所以也存有该方法.

图片 7

float和double

  Java 2D库为各类图形类提供float类型坐标和double类型坐标两个本子。

  如Rectangle2D类,那是四个存有三个实际子类的抽象类,那几个具体子类也是静态内部类:

    Rectangle2D.Float

    Rectangle2D.Double

  实际上,由于Rectangle2D.Float和Rectangle2D.Double都扩张于Rectangle2D类,而且子类只覆盖了Rectangle2D超类中的方法,所以不要求记住图形类型,可以直接动用Rectangle2D变量保存矩形的援引。

    Rectangle2D floatRect = new Rectangle2D.Float(10.0F, 25.0F, 22.5F, 20.0F);

    Rectangle2D doubleRect = new Rectangle2D.Double(10.0, 25.0, 22.5, 20.0);

  唯有在结构图形对象时,才须求利用在那之中类。

  Rectangle2D方法的参数和重返值类型均为double,举例,即使Rectangle2D.Float对象存款和储蓄着float类型的大幅,getWidth方法也回到三个double值。

  对Rectangle2D的阐明也适用于此外图形类。

5.1.2.  JFrame展现在显示屏中间

setLocationRelativeTo()方法

java.awt.Window.setLocationRelativeTo(Component c)
设置窗口相对于指定组件的位置。
如果 c 为 null,则此窗口将置于屏幕的中央。

 

setLocationRelativeTo(null)方法能够在荧屏上居中显得框架.

万一不想要设置在中间,能够采纳

setLocation(200, 100);

 

图片构造方法

  Rectangle2D和Ellipse2D类都以由集体超类RectangularShape承袭来的。RectangularShape定义了几个有关图形操作的通用方法,比较常用的有getWidth、getHeight、getCenterX、getCenterY等。

  Rectangle2D和Ellipse2D对象很轻巧构造,须要提交左上角的xy坐标和宽度和惊人。比方:

Ellipse2D ellipse = new Ellipse2D.Double(150,200,100,50);

  用左上角位居(150,200),宽100,高50的外接矩形构造贰个椭圆。

  在结构椭圆(这种情形还现出在组织其余图形时)时,经常可以预知椭圆的基本、宽和高,实际不是外接矩形的终点,setFrameFromCenter方法使用基本点,但仍旧要提交多少个顶点中的一个。

  常常得到的是矩形的多少个对角点,而那八个对角点并不一定是左上角和右下角,无法大约地这样构造:

Rectangle2D rect = new Rectangle2D.Double(px, py, qx-px, qy-py);

 

  借使七个坐标之差为负值,矩形就为空。

  在此种气象下,首先创制一个空矩形,然后调用setFrameFromDiagonal方法。

Rectangle2D rect = new Rectangle2D.Double();

rect. setFrameFromDiagonal(px, py, qx, qy);

 

要想组织一条直线,就提供起源和终极,那七个点能够用Point2D对象表示,也得以利用部分数值表示。

 

演示程序,功效:绘制多少个矩形,那个矩形的内接椭圆,矩形的一条对角线,以矩形主题为原点的一个圆。

图片 8图片 9例7-4 DrawTest

/**
   @version 1.31 2004-05-03
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class DrawTest
{  
   public static void main(String[] args)
   {  
      DrawFrame frame = new DrawFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

/**
   A frame that contains a panel with drawings
*/
class DrawFrame extends JFrame
{
   public DrawFrame()
   {
      setTitle("DrawTest");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      // add panel to frame

      DrawPanel panel = new DrawPanel();
      add(panel);
   }

   public static final int DEFAULT_WIDTH = 400;
   public static final int DEFAULT_HEIGHT = 400;  
}

/**
   A panel that displays rectangles and ellipses. 
*/
class DrawPanel extends JPanel
{  
   public void paintComponent(Graphics g)
   {  
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;

      // draw a rectangle

      double leftX = 100;
      double topY = 100;
      double width = 200;
      double height = 150;

      Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
      g2.draw(rect);

      // draw the enclosed ellipse

      Ellipse2D ellipse = new Ellipse2D.Double();
      ellipse.setFrame(rect);
      g2.draw(ellipse);

      // draw a diagonal line

      g2.draw(new Line2D.Double(leftX, topY, leftX   width, topY   height));

      // draw a circle with the same center

      double centerX = rect.getCenterX();
      double centerY = rect.getCenterY();
      double radius = 150;

      Ellipse2D circle = new Ellipse2D.Double();
      circle.setFrameFromCenter(centerX, centerY, centerX   radius, centerY   radius);
      g2.draw(circle);
   }
}

 

 

本文由betway必威手机版发布于betway必威手机版官网,转载请注明出处:事件监听机制,Java读书笔记10

关键词: Java

上一篇:必威国际Java中的常用类,自动装箱拆箱

下一篇:没有了