java中GUI是什么意思啊解释一下

java中GUI是什么意思啊解释一下,第1张

常常用Controler来表示,一个类

一般初学的时候,都是在一个监听接口的方法实现中对某另一个类进行操作

比如一点地址栏的回车,下面的状态栏会显示IP地址等

按照面向对象的发消息机制,有控制模块的程序不再是直接对其他类进行操作,而是在触发事件的时候向控制模块发消息,由控制模块启动相应类的进程,向其发消息,以改变其状态这样一来各个组件之间不必互相认识,只要通过控制中心联系就可以了

例如上面那个例子,点完回车后,地址栏的向控制器发一个消息,控制器启动响应的状态栏对象的进程,再向其发送一个消息,使其调用自身的改变状态方法

不论是awt,swing都是JavaGUI的组成部分。

没有人让你单纯的为了使用atw或swing而特意去用。

用哪个能达到功能就有哪个。

并且这些东西混着用并不会照成太大的冲突。

使用JFrame作为主容器,JPanel作为主绘图底板,基本上JavaGUI都是这么设计的。

 当Java在 年的春天第一次发布的时候 它包含了一个叫AWT(Abstract Windowing Toolkit)的库 用来构建图形用户界面应用程序 Java很有雄心的宣言-- write once run anywhere 许诺 一个具有下拉菜单 命令按钮 滚动条以及其他常见的GUI控件的应用程序将能够在各种操作系统上运行而不必重新编译成针对某一平台的二进制代码 包括Microsoft Windows Sun s own Solaris Apple s Mac OS以及Linux

 虽然最初Java是支持操作系统独立的应用程序开发 在Java提出 write once run anywhere 宣言那段时间的革命导致了Java applet和主导桌面应用程序计划的产生

 尽管从那以后大部分构建桌面应用程序的成就都慢慢衰退 Java构建图形用户界面的能力反倒增强了 跟踪Java GUI的发展和演化 我们将发现 个主要的构建窗口程序库:AWT Swing和SWT(Standard Widget Toolkit) 在这一章里我们将查看和分析这 个库中的每一个库 并且我们将一起来看一看第 个库--JFace 其实JFace不算一个真正的构建窗口程序库 而是在基于SWT之上的一个抽象层

  AWT

 很多围绕着介绍Java技术的令人激动的地方都基于applets--一个可以让程序通过Internet发布并在浏览器内执行的新技术 用户和开发人员都热衷于斯 因为applets许诺将简化跨平台应用程序的开发 维护和发布 而这是商业软件开发中几个最富挑战性的话题

 为了方便用Java构建图形用户界面 Sun最初提供了一个在所有平台下具有的独特Java外观的图形界面库 Sun在applet技术策略方面的首要伙伴Netscape提出applets应该维持和运行时平台一样的外观 他们希望applets在某一平台下在显示和行为上能够像其他应用程序一样

 为了实现Netscape的 本地外观 的目标 在JDK的第一个发布版中包含了AWT这个库 AWT的缺省实现使用了 对等 机制 即每一个Java GUI窗口部件都在底层的窗口系统中有一个对应的组件

 例如 每一个java awt Button对象将在底层窗口系统中创建一个唯一对应的button 当用户点击那个按钮的时候 事件将从本地实现库传送到Java虚拟机里 并且最终传送到与java awt Button对象相关联的逻辑 对等系统的实现以及Java组件与对等组件之间的交流的实现都隐藏在底层JVM实现中 Java语言级的代码仍然跨平台

 尽管如此 为了保持 write once run anywhere 的许诺 Java不得不妥协和折衷 特别的 Java采用了 最小公分母 的方法 即AWT仅仅提供所有本地窗口系统都提供的特性 这就需要开发人员为更多高级特性开发他们自己的高级窗口部件 然后提供给用户不同的使用体验

 其他的问题也减缓了人们对applets的接受和承认 Applets运行在一个安全的 沙箱 里面并且能够阻止恶意的applets对文件系统 网络连接等资源的滥用 尽管沙箱提供了安全性 但它 了应用程序 毕竟一个应用程序不能运用一个网络连接来保存一个文件是不好的 Java GUI应用程序也不能像本地程序一样响应灵敏 这是在当前硬件平台和Java的解释性天性下预期结果

 所以 用AWT开发的应用程序既缺少流行GUI程序的许多特性 又不能达到在显示和行为上像用本地窗口构建库开发的程序一样的目标 应该有一个更好的库来让Java GUI取得成功

  Swing

 于 年JavaOne大会上提出并在 年 月发布的JFC(Java Foundation Classes)包含了一个新的使用Java窗口开发包 这个新的GUI组件叫做Swing 感觉到它是对AWT的升级 并且看起来对Java占据计算机世界很有帮助 对Java来说已经万事具备了:可下载的applets将是未来的软件 人们将从其他操作系统转向JavaOS 从传统的计算机转向叫做JavaStation的瘦客户端网络计算机 Microsoft将最终因为不能在桌面程序领域与之想抗衡而被废黜 虽然这些景象从来没有实现 Swing作为Java applets和applications的GUI库倒确实十分繁荣

  Swing架构

 尽管 Swing 仅仅是这个新组件的指代名称 它一直持续使用到今天 可能是因为这个名称太贴切了 Swing尝试着以以下几种方式改变公认的观点:

 AWT依赖对等架构 用Java代码包装本地窗口部件 Swing却根本不使用本地代码和本地窗口部件

 AWT把绘制屏幕交给本地窗口部件 Swing自己的组件绘制自己

 因为Swing不依赖本地窗口部件 它可以抛弃AWT的最小公分母的方法并在每个平台下实现每个窗口部件 从而创建一个比AWT更强大的开发工具包

 Swring缺省情况下采用本地平台的显示外观 然而 它并不仅仅限于此 而是还可以采用插件式的显示外观 因此Swing应用程序可以看起来想Windows应用程序 Motif应用程序 Mac应用程序甚至它自己的显示外观-- 金属 所以 Swing应用程序可以完全忽略它运行时所在的操作系统环境并且仅仅看起来像自己 这是单调一致的桌面应用程序外观的一大挑衅 想象一下Swing有多傲慢!

 尽管如此 Swing组件超越了简单的窗口部件 它体现了正不断出现的设计模式以及一些最佳实践 采用Swing 你不仅仅得到GUI窗口部件的句柄和它所包含的数据 而是定义一个模型去保存数据 定义一个视图去显示数据 定义一个控制器去响应用户输入 事实上 大部分Swing组件的构建是基于MVC(model view controller)模式的 MVC使应用程序开发变得更清晰 更易维护和管理

  Swing的缺点

 尽管Swing在AWT的基础上做出了巨大的改进 它仍然没能使Java作为构建桌面应用程序的工具 也许Swing的拥护者会立即举出Swing的成功应用案例 例如开源文本编辑器jEdit或者Borland的UML(Unified Modeling Language)建模工具Together 但是Swing应用程序仍然在桌面应用方面显得很少 Sun提出了一个记录可得到的Swing应用程序的列表 Swing Sightings 来证明Swing应用是值得注目的 然而我们也看到了 C++ Sightings 和 Visual Basic Sightings 的网页

 为什么Swing没有履行它的诺言原因可能归结为下面两点:

 速度的缺乏

 界面外观

 Swing的狂热者可能会对Swing速度慢这一点感到忿忿不平 不可否认 JIT(just in time)编译器 Java虚拟机以及Java语言本身就使得Swing应用程序和本地程序拉开了一定差距 尽管如此 Swing仍显得比本地应用程序行动缓慢和响应不积极 由于桌面计算变得越来越快 用户的速度期望值也随之增加 任何可感知的迟缓都将是无法忍受的

 对Swing的显示外观的问题的抱怨也引起了Swing的开发者的愤怒 毕竟他么宣称Swing拥有各种可插入式的外观 并且事实上可以显示成任何样子 J SE 甚至添加了对Windows XP和GTK+的支持 以致于在这些平台下运行的Swing应用程序会自动采用该平台的外观

 尽管如此 问题仍然存在:Swing将一直处于最新的图形用户界面的后面 因为必需在Java库里明确地添加对最新GUI的支持 当使用J SE 或更早的版本时在Windows XP上运行的Swing应用程序将显现为Windows 的外观 而且 当使用XP themes或WindowBlinds等软件来改变皮肤或图形外观时用户日益铭记他们自己的特征和个性 而Swing不仅不理会操作系统 甚至连用户参数选择也不理会

 简短的说 Swing应用程序不像本地应用程序一样执行 外观也不一样 Java要想摆脱常年以来处于不断学习中的地位并掌握桌面应用程序开发中的众多角色 它的GUI仍需要改进

  SWT

 当社区人员开始构建Eclipse时 他们意识到Swing和AWT都不足以用来构建真实世界的商业程序 结果 他们决定构建一套新的GUI开发工具包用来显示Eclipse界面 这个工具包借用了VisualAge SmallTalk中的大量的库 他们把这个新的工具包命名为SWT(Standard Widget Toolkit) 意识到本地行为需要本地窗口部件 SWT的设计者们采用了AWT的对等架构 而仅仅当本地组件不存在时(例如Motif下的树形组件)才求助于Java实现 这样 SWT吸收了AWT和Swing实现的最好的部分:当可以得到本地组件时使用本地实现 当不能得到本地组件时使用Java实现 这就同时保证了与本地窗口部件相当的外观和响应度

 SWT于 年与Eclipse IDE(Integrated Development Environment)一起集成发布 在这个最初发布版之后 SWT发展和演化为一个独立的版本 它可以使用与众多操作系统 包括Microsoft Windows Mac OS X以及几种不同风格的Unix等 写作本书的这个时候 当前官方发布版本为 版为beta版 现在也可以下载 本系列文章采用SWT

 另一个重要的优势为SWT的源代码是在一个开源许可下免费可得并无病毒的 这就意味着你可以在你的应用程序中使用SWT并且在任何许可认证下发布它 源代码对理解SWT库的低级别功能性和调试应用程序都是很有帮助的 开源软件也意味着比商业发布软件更新的更加频繁

  JFace

 JFace的构建基于SWT 它提供了SWT的功能和更简易的MVC模式 SWT使用直接的API提供了原生的窗口部件 例如 你创建一个table部件并且插入你想显示的行和列的数据 JFace则提供了在SWT基础之上的抽象层 所以你可以对抽象层编程然后抽象层与SWT API交互来替代直接对SWT API编程 考虑一下对本地C窗口部件接口编程同使用C++GUI类库的区别或是使用AWT与Swing的区别 这些类比将有助于阐述SWT与JFace的区别 例如 为了使用JFace中的table 你仍旧创建table窗口部件 但是你不向里面插入数据 反而 你将你的content(或model) provider类和你的display(或 view) provider类提供给它 接着 table调用你提供的类来决定数据内容和怎样显示数据内容 JFace没有彻底地抽象SWT 即使在用JFace写的程序中也会常常出现SWT及它的低级API 在本文第二部分带领您构建正确的SWT基础之后 我们将在第三部分探究JFace的力量

  总结

lishixinzhi/Article/program/Java/hx/201311/26708

 Java的GUI编程(Graphic User Interface 图形用户接口) 是在它的抽象窗口工具箱(Abstract Window Toolkit AWT)上实现的 java awt是AWT的工具类库 其中包括了丰富的图形 用户界面元件和布局管理器的支持

 GUI主要用在两个地方

 ◆Application

 ◆Applet

  )GUI界面

 在Java GUI中 用户与程序之间交互的一个控制面板 其内包含有菜单 控件(或组件) 容器并能响应用户的事件

 现在有各种各样的窗口系统 不同的窗口系统提供给程序设计的程序库是大不一样的 例如 基于Windows的SDK 和基于Unix平台的X Windows的Xlib

 为了使程序能在不同的窗口系统下运行 Java提出了 抽象窗口系统 的概念 提供了AWT(抽象窗口工具箱) 使得Java能够在不同的窗口系统下运行

  )Java中的GUI实现方式

 采用AWT(抽象窗口工具集)从而可使Java GUI适用于不同OS的环境 打造多系统的用户界面

 特点如下

 ① 其具体实现由目标平台下的OS来解释 从而导致Java GUI在不同平台下会出现不同的运行效果(窗口外观 字体等的显示效果会发生变化)

 ② 组件在设计时不应采用绝对定位 而应采用布局管理器来实现相对定位 以达到与平台及设备无关

  )新增的Java Swing GUI组件

lishixinzhi/Article/program/Java/hx/201311/26362

import javaawtBorderLayout;

import javaawtGraphics;

import javaawtGridLayout;

import javaawteventActionEvent;

import javaawteventActionListener;

import javautilArrayList;

import javaxswingJButton;

import javaxswingJFrame;

import javaxswingJLabel;

import javaxswingJPanel;

import javaxswingJTextField;

/

@author szmneo

/

public class DrawCircle {

static JFrame frame = new JFrame();

static DrawPanel p1 = new DrawPanel();

static JLabel l1 = new JLabel("直径:");

static JLabel l2 = new JLabel("周长:");

static JLabel l3 = new JLabel("面积:");

static JTextField tx = new JTextField("输入半径",10);

public static void main(String[] args){

JPanel p2 = new JPanel();

JPanel p3 = new JPanel();

JPanel p4 = new JPanel();

JButton b1 = new JButton("OK");

JButton b2 = new JButton("Clear");

p2add(tx);

p2add(b1);

p2add(b2);

p3setLayout(new GridLayout(3,1));

p3add(l1);

p3add(l2);

p3add(l3);

p4add(p2);

p4add(p3);

framesetLayout(new BorderLayout());

frameadd(p1,BorderLayoutCENTER);

frameadd(p4,BorderLayoutSOUTH);

framesetTitle("Draw Circles");

framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

framesetSize(500,400);

framesetVisible(true);

b1addActionListener(new ActionListener() {//添加绘制事件

public void actionPerformed(ActionEvent e) {

DrawAction();

}

});

b2addActionListener(new ActionListener() {//添加清除事件

public void actionPerformed(ActionEvent e) {

ClearAction();

}

});

}

static void DrawAction(){

float r = 0;

try {

r = FloatparseFloat(txgetText());

} catch (NumberFormatException numberFormatException) {

txsetText("请输入数字(0-400)");

}

l1setText("直径:" + FloattoString(2 r));

l2setText("周长:" + FloattoString((float) (2 r MathPI)));

l3setText("面积:"+ FloattoString((float) (MathPI r r)));

p1setR(r);

p1repaint();

framerepaint();

framesetVisible(true);

}

static void ClearAction(){

p1Clear();

p1repaint();

framerepaint();

framesetVisible(true);

}

static class DrawPanel extends JPanel{

int x,y;

float r=0f;

ArrayList CircleData = new ArrayList();

void setR(float r){

thisr=r;

x = (int)(Mathrandom()getWidth()-2r)+1;

if(x<0)x=0;

y = (int)(Mathrandom()getHeight()-2r)+1;

if(y<0)y=0;

Circle circle = new Circle();

circlesetR(r);

circlesetX(x);

circlesetY(y);

CircleDataadd(circle);//添加一个圆

}

void Clear(){

CircleData = new ArrayList();//清空列表

repaint();

}

public void paintComponent(Graphics g){

superpaintComponent(g);

for(int i=0;i<CircleDatasize();i++){//画每个圆

int a =((Circle)CircleDataget(i))getX();

int b =((Circle)CircleDataget(i))getY();

int d =(int)(2((Circle)CircleDataget(i))getR());

gdrawArc(a, b, d, d, 0, 360);

}

}

}

}

class Circle {//定义每个圆的信息

int x,y;

float r=0f;

void setR(float r){

thisr=r;

}

void setX(int x){

thisx=x;

}

void setY(int y){

thisy=y;

}

float getR(){

return r;

}

int getX(){

return x;

}

int getY(){

return y;

}

}

试一下下面的代码

(如果点击按钮后没有任何变化,将窗口最小化一下就有了)

没有出现这个问题的话,也请告诉我一下~

import javaawt;

import javaawtevent;

import javaxswing;

import javautil;

public class painting extends JFrame implements ActionListener{

private JButton round,rectangle,ellipse,beeline;

private JLabel xaxis,yaxis,remain,information;

private JTextField xTF,yTF;

private BorderLayout layout;

private Container cp;

private JPanel pCenter;

Vector<Object> v=new Vector<Object>(); //定义一个集合类用于存储按钮对象

public painting(){ //构造方法 ------------------框架初始化-------------------

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

setTitle("painting");

setSize(400,500);

layout = new BorderLayout();

cp = getContentPane();

cpsetLayout(layout);

round= new JButton("画圆");

rectangle= new JButton("画矩形");

ellipse= new JButton("画椭圆");

beeline= new JButton("画直线");

xaxis=new JLabel("x坐标");

yaxis=new JLabel("y坐标");

remain=new JLabel("右下角坐标(400,500) ");

xTF=new JTextField("0",5);

yTF=new JTextField("0",5);

JPanel pUp= new JPanel();//第一个面板 在上部

pUpadd(remain);

pUpadd(xaxis);//置两个文本框

pUpadd(xTF);

pUpadd(yaxis);

pUpadd(yTF);

cpadd(pUp, "North");

//pCenter=new JPanel();//第二个面板 在中部

//pCenteradd(information);//置显示说明与画图区

//cpadd(pCenter,"Center");

JPanel pDown= new JPanel();//第三个面板 在下部

pDownadd(round);// 置四个按钮

pDownadd(rectangle);

pDownadd(ellipse);

pDownadd(beeline);

cpadd(pDown, "South");

roundaddActionListener(this); //置按钮监听--------------按钮行为监听与响应-------------

rectangleaddActionListener(this);

ellipseaddActionListener(this);

beelineaddActionListener(this);

}

public void actionPerformed(ActionEvent e) {//监听响应

vadd(egetSource());//将按钮情况存入v中

}

public void paint(Graphics g) { //--------------绘图响应-------------

superpaint(g);

int xx=IntegerparseInt(xTFgetText());//获取位置值

int yy=IntegerparseInt(yTFgetText());

int size=0;

Object o;

//while(vsize()!=size){//当用户点击按钮选择某一种图形时,v的大小就会比size值大1,当绘图完成后,vsize又等于size;效果就是:出现点击 即刻处理

o=vlastElement();

if(o == round) {gdrawOval(xx,yy,50,50);}

else if (o == rectangle){gdrawRect(xx,yy,100,50);}

else if (o == ellipse) {gdrawOval(xx,yy,100,50);}

else if(o == beeline) {gdrawLine(xx,yy,xx+100,yy);}

size++;

}

}

public static void main(String[] args){ // ------------程序入口-------------

JFrame frame = new painting();

framesetVisible(true);

}

}

Java技术是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。(题外话:Java热门的原因之一就是一个跨平台的概念,和跨平台类似跨浏览器的好处也是如此,这也是现在AJAX技术流行的原因之一。另外现在热炒的RIA富客户端的概念下的技术除了AJAX外还有Adobe的Flash/Flex,微软的Silver Light,SUN的JavaFX等,个人更看好FLash/Flex,原因是Flash插件在浏览器端占用率很高)

Java技术的重要性就不讲了,从最近流行的一个统计数据上来说,目前世界上编程语言Java 、C 、VB、C++依次排名前4位,这排名本身不说明什么,至少也是工业界对编程语言使用上一个侧面的反映吧。

Java编程语言与众不同之处在于:Java程序既是编译型的(转换为一种称为Java字节码的中间语言),又是解释型的(JVM 对字节码进行解析和运行)。编译只进行一次,而解释在每次运行程序时都会进行。编译后的字节码采用一种针对JVM 优化过的机器码形式;解释器是JVM 的实现。这段是摘自网上的,编译原理学的不是很好,对这门语言的背后运行机制理解到这样了。

Java平台是一种纯软件平台,它有三个版本Java SE、JavaEE、Java ME。

Java SE(Java Platform,Standard Edition)这个版本以前叫做J2SE,后来版本号从14直接跳到50,其实也就是15,所以就叫成Java SE 50。目前Java开发人员使用较多的版本是50,当然还有Java SE 60这个更新的版本。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java 应用程序。记住这个扣五七八零二四一四四Java SE还包含了支持Java Web服务开发的类,并为Java EE这个版本提供基础。

虽说桌面应用程序,Java一直不被看好,但也稍微提一下,负责桌面GUI开发的类库我知道的有:JDK自带的主要是AWT/SWING这个Java原生类库;也可以使用IBM的SWT/JFace这个第三方类库。开发工具我了解的有:NetBeans(最近已经是60final版了,做GUI有使用VB的感觉),Eclipse(SWT/JFace这个项目其实就是做Eclipse项目时扩展出来的,所以对SWT/JFace支持的也不错)。

Java EE(Java Platform,Enterprise Edition)这个版本以前叫做J2EE,也就是大家可能听得比较多的,也是Java比较流行的领域,Java的企业级版本。Java EE下有很多流行的开发框架,像Struts、Spring、Hibernate这种流行的所谓SSH组合等。

根据项目大小、应用领域,技术平台的选择面还是很多的,除了Java EE,还有Net,LAMP组合(Linux、Apatch、MySql、PHP组合),相对来说比较新Ruby在Ruby on Rails的框架应用,后两者可能在相对来说比较轻量级的Web领域运用成功案例比较多,更重量的企业级潜力还有待挖掘。

Java ME(Java Platform,Micro Edition)这个版本以前叫做J2ME。应用领域像各种移动设备和嵌入式设备,比如:手机、PDA、电视机顶盒和打印机。

Java ME不是太熟悉,不过移动设备和嵌入式设备的开发个人觉得算是比较有意思的领域,最近比较瞩目的业界新闻有一个就是Google发布开源智能手机操作系统开发平台Android,也就是前一阵子炒得很火的GPhone(原来Google出的不是手机,而是一个手机操作系统开发平台)。这个平台貌似会对Java ME有些冲击,按照网上的消息,Android包括:1、高度定制的Linux操作系统内核及智能手机硬件驱动支持;2、经过Google修改过的Java虚拟机Dalvik,这里的性能比SUN的Hotspot高,支持大部分Java核心类库;3、大量智能手机开发核心类库;4、大量现成的智能手机应用软件;5、基于Eclipse的开发环境。也是按照网上的说法,Java EE提供了统一的编程平台,但不能调用操作系统的资源;而Android下直达操作系统,上直达应用软件,如:浏览器、日历、地图等。

Java开发工具很多,个人使用的IDE有Eclipse和NetBeans。Eclispe比较流行,各种插件也多,当然用起来也不错;NetBeans现在也是越做越好了,介绍这两个IDE主要是开源的,当然还有其它工具如JBuilder、IntelliJ、JCreator。这些IDE各有优势劣势,根据你开发的项目来选择了。

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/3820527.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-03-27
下一篇2024-03-27

发表评论

登录后才能评论

评论列表(0条)

    保存